网站能够正常连接数据库,各项配置应该均正确,但是在注册用户时无法保存至数据库并出现了如下问题,不太明白哪里undefined了。
E:\code\user-auth-example\node_modules\mongodb\lib\utils.js:98 process.nextTick(function() { throw err; }); ^TypeError: Cannot read property 'email' of undefined at E:\code\user-auth-example\server.js:38:34 at E:\code\user-auth-example\node_modules\mongodb\lib\collection.js:525:5 at E:\code\user-auth-example\node_modules\mongodb\lib\collection.js:703:5 at handleCallback (E:\code\user-auth-example\node_modules\mongodb\lib\utils.js:95:56) at executeCommands (E:\code\user-auth-example\node_modules\mongodb\lib\bulk\ordered.js:398:12) at resultHandler (E:\code\user-auth-example\node_modules\mongodb\lib\bulk\ordered.js:425:5) at E:\code\user-auth-example\node_modules\mongodb-core\lib\connection\pool.js:455:18 at _combinedTickCallback (internal/process/next_tick.js:67:7) at process._tickCallback (internal/process/next_tick.js:98:9)
然后下面是代码,比较多,package.json, express按照书上的方法用的是旧版本:
{ "name":"user-auth-example", "version":"0.0.1", "dependencies":{ "express":"2.5.8", "mongodb":"2.2.24", "jade":"0.31.2" }}
server.js:
var express=require('express'),Db = require('mongodb').Db,Server = require('mongodb').Serverapp=express.createServer();var db = new Db('test01', new Server('localhost', 27017));db.open(function(err,client){ if(err) throw err; console.log('\033[96m + \033[39m connected to mongodb'); app.users=db.collection('users'); app.listen(3000,function(){ console.log('\033[96m + \033[39m app listening on *:3000'); });});app.use(express.bodyParser());app.use(express.cookieParser());app.use(express.session({secret:'my secret'}));app.set('view engine','jade');app.set('view options',{layout:false});app.get('/',function(req,res){ res.render('index',{authenticated:false});});app.get('/login/:signupEmail?', function (req, res) { res.render('login', { signupEmail: req.params.signupEmail });});app.get('/signup',function(req,res){ res.render('signup');});app.post('/signup', function (req, res, next) { app.users.insert(req.body.user, {safe:true}, function(err,doc) { if (err) return next(err); res.redirect('/login/'+doc[0].email); });});
四个放在当前目录下views文件夹的jade,laydout.jade:
doctype 5html head title MongoDB example body h1 My first MongoDB app hr block body
index.jade:
include layoutblock bodyif (authenticated) p Welcome back, #{me.name} a(href="/logout") Logoutelse p Welcome new visitor! ul li: a(href="/login") Login li: a(href="/signup") Signup
login.jade:
include layoutblock bodyif (signupEmail) p Congratulations on signingup! Please login below.form(action="/login", method="POST") fieldset legend Log in p label Email input(name="user[email]", type="text", value=signupEmail) p label Password input(name="user[password]", type="password") p button Submit p a(href="/") Go back
signup.jade:
include layoutblock bodyform(action="/signup", method="POST") fieldset legend Sign up p label First input(name="user[first]", type="text") p label Last input(name="user[last]", type="text") p label Email input(name="user[email]", type="text") p label Password input(name="user[password]", type="password") p button Submit p a(href="/") Go back
最后吐槽一下Smashing Node.js这本书,真的太多错误了。然后若有大神能够回答此问题真的感激不敬!
解决方案
insert方法的RESULT不是你插入的doc,详细你可以查看官方api:链接描述
api建议使用insertOne不建议使用insert