博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NodeJS开发指南——mongoDB、Session
阅读量:4087 次
发布时间:2019-05-25

本文共 5266 字,大约阅读时间需要 17 分钟。

记录一下这两天用nodeJS搭建一个博客系统遇到的坑;

关于mongoDB

数据库的连接

db.js

var settings = require('../settings');var mongo = require('mongodb');var Server=mongo.Server;var Db=mongo.Db;var server = new Server('localhost', 27017, {
auto_reconnect: true});var db = new Db(settings.db, server);var Connection = require('mongodb').Connection;module.exports=db;

数据库的查询

User.get = function(username,callback) {
// body... mongodb.open(function(err, db) {
if (!err) { console.log("We are connected"); db.collection('users', function(err, collection) {
collection.find().toArray(function(error, users) {
console.log(users); }); // collection.find({ a: 1 }).toArray(function(error, bars) { console.log(bars); }); collection.findOne({ name:username }, function(error, doc) {
console.log('username'+doc); if(doc){ var user = new User(doc); callback(err, user); } }); }); } });};

1 、Connection strategy not found

app.use(express.session({secret: settings.cookieSecret, store: new MongoStore({          db: settings.db        })}));

改成

app.use(session({    secret: settings.cookieSecret,    store: new MongoStore({        url: 'mongodb://localhost/microblog',        autoRemove: 'native'    })}));

2、throw new Error(‘no hostname or hostnames provided in connection string’);

需要在mongoDB里面建立一个数据库
这里写图片描述

3、server instance in invalid state undefined

原因第一次使用了数据库之后未正常关闭

var mongodb = require('./db.js')function User(user) {
this.name = user.name; this.password = user.password; this.email = user.email;}module.exports = User;User.prototype.save = function(callback) {
// body... var user = { name: this.name, password: this.password, email: this.email } console.log('save' + user.name) mongodb.open(function(err, db) {
if (err) { console.log('User open err') return callback(err); } db.collection('users', function(err, collection) {
console.log(err) if (err) { mongodb.close(); return callback(err); } console.log('User open success') //为name属性添加索引 var doc1 = user; collection.ensureIndex('name', { unique: true }); //写入user文档 collection.insert(doc1, { safe: true }, function(err, result) {
mongodb.close(); callback(err, user); }); }) })};User.get = function(username, callback) {
// body... mongodb.open(function(err, db) {
if (!err) { console.log("We are connected"); db.collection('users', function(err, collection) {
collection.find().toArray(function(error, users) {
console.log(users); }); // collection.find({ a: 1 }).toArray(function(error, bars) { console.log(bars); }); collection.findOne({ name: username }, function(error, doc) {
console.log('username' + doc); if (doc) { var user = new User(doc); callback(err, user); } mongodb.close(); //这里之前忘记写了 callback(err, user); }); }); } });};

关于处理POST请求

1、注册页面的写法

reg.ejs

<%- include header %>
<%- include footer %>

生成的界面是这样的。

这里写图片描述

一旦填好信息之后,可以看到提交的username、email和password,但是我们后台并没有对这个请求做任何处理,下面我们来写一下。

这里写图片描述

这里写代码片

req.flash 是 Express 提供的一个奇妙的工具,通过它保存的变量只会在用户当前 和下一次的请求中被访问,之后会被清除,通过它我们可以很方便地实现页面的通知和错误信息显示功能。

User 是我们设计的用户对象,在后面我们会详细介绍,这里先假设它的接口都是可
用的,使用前需要通过 var User = require(‘../models/user.js’) 引用。
通过 req.session.user = newUser 向会话对象写入了当前用户的信息,在后面 我们会通过它判断用户是否已经登录。

动态视图

1、app.dynamicHelpers({TypeError: Object function (req, res, next)

原因是新版本的Express已经不支持dynamicHelpers方法了。可以用locals来替代。

app.use(function(req, res, next) {
res.locals.user = req.session.user; var err = req.flash('error'); var success = req.flash('success'); res.locals.error = err.length ? err : null; res.locals.success = success.length ? success : null; next();});

2、user is not defined

以上代码一定要放在指定路由的语句之前,不然页面中访问user、error、success变量会出错,提示:user is not defined。

Session保存

在登录过程中识别用户是一个很重要的点。

《nodeJs开发指南》这本书里 面用的方法不能用了,查了一下,目前保存session的方法是用express-session,和MongoStore,就是下面的两个module

const session = require('express-session');const MongoStore = require('connect-mongo')(session);

然后使用方法如下

// Cookie 解析的中间件app.use(cookieParser());// 提供会话支持app.use(session({    secret: settings.cookieSecret,    store: new MongoStore({        url: 'mongodb://localhost/' + settings.db,        autoRemove: 'native'    })}));

这样在每一个路由请求的时候,我们都能获取session

如app.js

/* GET home page. */router.get('/', function(req, res, next) {
// if(user); console.log("index router:"+req.session.user) console.dir(req.session) res.render('index', { title: 'Express' });});

当请求的时候,我们控制台就会打印

这里写图片描述

你可能感兴趣的文章
数据结构与算法10-冒泡排序、插入排序、选择排序
查看>>
数据结构与算法14-跳表
查看>>
Java并发编程 | 一不小心就死锁了,怎么办?
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
(python版)《剑指Offer》JZ06:旋转数组的最小数字
查看>>
(python版)《剑指Offer》JZ13:调整数组顺序使奇数位于偶数前面
查看>>
(python版)《剑指Offer》JZ28:数组中出现次数超过一半的数字
查看>>
(python版)《剑指Offer》JZ30:连续子数组的最大和
查看>>
(python版)《剑指Offer》JZ32:把数组排成最小的数
查看>>
(python版)《剑指Offer》JZ02:替换空格
查看>>
JSP/Servlet——MVC设计模式
查看>>
使用JSTL
查看>>
Java 8新特性:Stream API
查看>>
管理用户状态——Cookie与Session
查看>>
最受欢迎的前端框架Bootstrap 入门
查看>>
JavaScript编程简介:DOM、AJAX与Chrome调试器
查看>>
通过Maven进行项目构建与管理
查看>>
通过Maven管理项目依赖
查看>>
通过Spring Boot三分钟创建Spring Web项目
查看>>
Spring的IoC(依赖注入)原理
查看>>