【求助】 如何避免过多的调用中间件。 -- 练习《Node.js开发指南》
发布于 2年前 作者 alan1988 1656 次浏览
使用express3 中 使用了官方推荐的 req.flash() -> res.session.messages = ['foo'] or similar  遇到的问题 
使用session 来保存错误提示后,我在app.js 里加了一层中间件。

用来将session中数据提取出来, 并删除保存了错误提示信息的session, 

按照书上的例子,原本可以正常显示的, 但是由于加了一层是否判断权限的方法之后, 

中间件会调用两次,这样session 里的数据在第一会被清空,其二次就拿不到了。造成页面显示不正常。

附上线上地址  198.136.24.206:3000

中间键如下

app.use(function(req,res,next){ var error = req.session.error , success = req.session.success; delete req.session.error; delete req.session.success; res.locals.user = req.session ? req.session.user:’’; res.locals.error = '’; res.locals.success = '’; if (error) res.locals.error = error; if (success) res.locals.success = success; next(); });

权限验证如下:

app.get('/reg’, checkNotLogin); app.get('/reg’, function(req, res){ console.log(‘reg get’); res.render('reg’, { title: '用户注册’, }); });

  app.post('/reg', checkNotLogin);
  app.post('/reg', function(req, res){
    //检验用户两次输入的口令是否一致
    if (req.body['password-repeat'] != req.body['password']){
      console.log('hello password');
      console.log('p1:'+req.body['password-repeat']);
      console.log('p2:'+req.body['password']);
      req.session.error = '两次输入的口令不一致';
      return res.redirect('/reg');
    }
    //生成口令的散列值
    省略..

function checkNotLogin(req, res, next) { console.log(‘check not login’); if (req.session.user) { req.session.error = '已登陆’; return res.redirect(‘/’); } next(); }

}
9 回复

我没看懂,session 赋值后是不会清空的,除非你自己给清了。

第一次玩nodejs,请大家多多指点。

嗯,是的,是自己清空的,但是由于中间键被调用了两次。 导致用于在页面上显示错误变量的值也清空了。

页面无法正常显示了。

中间件一次请求不会调用两次,除非你自己重定向清了,那就是你本身逻辑有问题。不能请求一次就清一次吧。session毕竟是维持很长一段时间的。

嗯,是的, 是重定向到注册页面时 ,又判断了一次是否登陆的方面

app.get('/reg’, checkNotLogin); app.get('/reg’, function(req, res){

}

如上所示。

重定向到注册页面时会调用两次中间件。。

有没有好的办法避免该问题呢?

没必要避免,因为中间件每次请求都会调用一次,我想是因为你登陆后没有附上实际的登录信息。req.session.user 这个值你在哪里赋值?正常判断它就好了。一般你也不会清它吧?

附上github源码地址 https://github.com/alan-hjkl/MicroBlog-with-jade

github 也是第一次玩,命令还不太会,用官方工具同步上去的。

我在注册时,密码输入不一样的。

此时页面应该显示密码不一致的信息, 我需要这样的信息提示。。

@alan1988 不一致可以在前端js 判断提示。假如想判断错误,可以再next 里面加上 err 错误,可以通过路由向下 传递、

回到顶部