Node.js : 0.10.22 +
Express : 3.4.4 +
MongoDB : 2.4.8 +
有2个问题,在index.js下
我修改后的完整代码如下:
app.post('/signup', function (req, res) { var username = req.body.username, email = req.body.email, password = req.body.password, password_re = req.body['password-repeat']; //昵称不能为空 if (username != '') { req.flash('error', '昵称不能为空!'); return res.redirect('/signup');//返回注册页 } //邮箱不能为空 if (email != '') { req.flash('error', '邮箱不能为空!'); return res.redirect('/signup');//返回注册页 } //密码不能为空 if (password != '') { req.flash('error', '邮箱不能为空!'); return res.redirect('/signup');//返回注册页 } //检验用户两次输入的密码是否一致 if (password_re != password) { req.flash('error', '两次输入的密码不一致!'); return res.redirect('/signup');//返回注册页 } //生成密码的 md5 值 var md5 = crypto.createHash('md5'), password = md5.update(req.body.password).digest('hex'); var newUser = new User({ username: req.body.username, password: password, email: req.body.email }); //检查用户名是否已经存在 User.get(newUser.username, function (err, user) { if (user) { req.flash('error', '用户已存在!'); return res.redirect('/signup');//返回注册页 } //如果不存在则新增用户 newUser.save(function (err, user) { if (err) { req.flash('error', err); return res.redirect('/signup');//注册失败返回主册页 } req.session.user = user;//用户信息存入 session req.flash('success', '注册成功!'); res.redirect('/');//注册成功后返回主页 }); }); //检查用户名是否已经存在 User.get(newUser.email, function (err, user) { if (user) { req.flash('error', '邮箱已存在!'); return res.redirect('/signup');//返回注册页 } //如果不存在则新增用户 newUser.save(function (err, user) { if (err) { req.flash('error', err); return res.redirect('/signup');//注册失败返回主册页 } req.session.user = user;//用户信息存入 session req.flash('success', '注册成功!'); res.redirect('/');//注册成功后返回主页 }); });});
第一:其中下面代码是我新加的,是想用来判断注册不能为空,下面代码好像没用,但是我输入一个昵称后,好像就能判断了
//昵称不能为空 if (username != '') { req.flash('error', '昵称不能为空!'); return res.redirect('/signup');//返回注册页 } //邮箱不能为空 if (email != '') { req.flash('error', '邮箱不能为空!'); return res.redirect('/signup');//返回注册页 } //密码不能为空 if (password != '') { req.flash('error', '邮箱不能为空!'); return res.redirect('/signup');//返回注册页 }
第二:我像再判断数据库是不是有邮箱了,句加了一段
//检查用户名是否已经存在 User.get(newUser.email, function (err, user) { if (user) { req.flash('error', '邮箱已存在!'); return res.redirect('/signup');//返回注册页 } //如果不存在则新增用户 newUser.save(function (err, user) { if (err) { req.flash('error', err); return res.redirect('/signup');//注册失败返回主册页 } req.session.user = user;//用户信息存入 session req.flash('success', '注册成功!'); res.redirect('/');//注册成功后返回主页 }); });
前面一个默认的,是判断昵称,这个是判断邮箱,这样新加好像不可,应该怎么加2个
解决方案
node的IO都是异步,像user.get
这种数据库查询,是异步操作,你的例子中,有查询用户名,和邮箱两个操作。
这两个都是异步操作,你如果不用其他的库的话。在node中,一般的做法是callback 套 callback,即在user.get useranme
的callback 函数里写 user.get email
的逻辑
大概是这个样子:
//检查用户名是否已经存在 User.get(newUser.username, function (err, user) { if (user) { req.flash('error', '用户已存在!'); return res.redirect('/signup');//返回注册页 } //检查邮箱是否已经存在 User.get(newUser.email, function (err, user) { if (user) { req.flash('error', '邮箱已存在!'); return res.redirect('/signup');//返回注册页 } // 所有都ok newUser.save(function (err, user) { if (err) { req.flash('error', err); return res.redirect('/signup');//注册失败返回主册页 } req.session.user = user;//用户信息存入 session req.flash('success', '注册成功!'); res.redirect('/');//注册成功后返回主页 }); }); });
这样的话就会造成callback hell
一个典型的callback hell
fs.readdir(source, function(err, files) { if (err) { console.log('Error finding files: ' + err) } else { files.forEach(function(filename, fileIndex) { console.log(filename) gm(source + filename).size(function(err, values) { if (err) { console.log('Error identifying file size: ' + err) } else { console.log(filename + ' : ' + values) aspect = (values.width / values.height) widths.forEach(function(width, widthIndex) { height = Math.round(width / aspect) console.log('resizing ' + filename + 'to ' + height + 'x' + height) this.resize(width, height).write(destination + 'w' + width + '_' + filename, function(err) { if (err) console.log('Error writing file: ' + err) }) }.bind(this)) } }) }) }})
可以使用其他的库来简化异步编程。推荐 async.js
https://github.com/caolan/async
用aysnc的话,这个逻辑可以这样写
async.parallel([ function(){ user.get email }, function(){ user.get useranme }], callback);