node.js 问题

我现在是学习这个
https://github.com/nswbmw/N-blog/wiki/%E7%AC%AC1%E7%AB%A0--%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E5%8D%9A%E5%AE%A2

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个

阅读 6.9k
3 个回答

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);
if (username != '') {
    req.flash('error', '昵称不能为空!'); 
    return res.redirect('/signup');//返回注册页
  }

翻译下:如果昵称不为空,则报错“昵称不能为空”。

另外,nodejs是异步回调的,下一个逻辑总是要写在前一个逻辑的回调中,而不是平铺着往下写。也就是需要不断嵌套嵌套嵌套直到最后返回res.end 。

楼主你好,我也在学习那个教程,但是遇到了req.flash() requires sessions这个问题,能说一下你怎么解决的吗?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题