本文总结Node.js结合MongoDB开发时遇到的典型问题,包括低版本驱动的系统兼容报错、insert操作异步返回空结果导致重定向失败,以及不同版本Express中Connect-Mongo模块引入方式的差异。通过具体代码对比与参数调整,提供实用的排查与解决方案。
本周学习重点在于Node.js与数据库的交互,并尝试结合Jade模板引擎构建了一个用户验证网站。在实际开发过程中,主要遇到了以下几类技术障碍。
MongoDB驱动版本兼容性问题
一、MongoDB驱动版本过低引发的兼容性问题
执行npm安装时出现报错:npm ERR! Not compatible with your operating system or architecture: mongodb@0.9.9。
该错误表明版本0.9.9仅支持Linux、Darwin(macOS)和FreeBSD系统,而最新版本的驱动已增加对Windows系统的支持。
Insert操作异步结果获取
二、Node.js执行insert操作后无法获取返回结果
相关代码片段如下:
app.post('/signup', function(req, res, next){
//插入文档
app.users.insert(req.body.user, function(err, doc){
if(err) return next(err);
res.redirect('/login/' + doc[0].email);
});
});
表象表现为重定向失败,但深层原因是数据库插入已成功,然而回调函数中的doc参数为空,导致无法获取doc[0].email。这是因为insert等数据库操作默认采用异步执行且不返回结果以确认运行状态。解决方法是增加第三个参数{safe: true},即修改为app.users.insert(req.body.user, {safe: true}, function(){……}),从而能够正确读取操作结果。
Connect-Mongo模块配置差异
三、Connect-Mongo模块导致store未定义错误
相关代码片段如下:
MongoStore = require('connect-mongo')
app.use(express.session({
secret:settings.cookieSecret,
store:new MongoStore({
db:settings.db
})
}));
经排查,该问题源于Express不同版本中Connect-Mongo模块的引入方式存在差异。官方Readme.md文档中对此有特别说明。
具体代码对比如下:
With express4:
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
app.use(session({
secret: settings.cookie_secret,
store: new MongoStore({
db : settings.db,
})
}));
With express<4:
var express = require('express');
var MongoStore = require('connect-mongo')(express);
app.use(express.session({
secret: settings.cookie_secret,
store: new MongoStore({
db: settings.db
})
}));
针对不同版本的Express,需相应调整模块引入代码即可解决该问题。
学习总结与后续计划
四、总结
通过本书的学习,了解了Node.js的一些核心特性以及外文技术站点的活跃动态。由于Node生态中热门板块更新频率较高,增加了学习难度,本书可作为入门参考。后续计划通过实战项目深入学习Sails后端框架,并将学习中遇到的问题记录在笔记本中以便回顾。