0

首先定义了一个函数

function checkLogin(req, res, next) {
    if (!req.session.user) {
      req.flash('error', '未登录!'); 
      res.redirect('/login');
    }
    next();
}

然后下面这样的用法每太看明白啊,请问这样的写法是javascript的语法糖还是node的语法糖

app.get('/reg', checkNotLogin);
  app.get('/reg', function (req, res) {
    res.render('reg', {
      title: '注册',
      user: req.session.user,
      success: req.flash('success').toString(),
      error: req.flash('error').toString()
    });
});

求各位大大解释一下或者给个相关链接参考一下

查看全部 4 个回答

2

Express 框架的 API,说白了就是钩子链。

app.use([path, ]hook)
app.get(path[, hook1, hook2, hook3, ...], handler)

任何一个钩子,只要调用了 res.end()(或者 res.send()res.render() 之类最终会调用 res.end() 的方法)后,就将内容返回给用户,中断后续的钩子;如果调用 next() 则把请求传递给下一个钩子,一直传递到最后的 handler

app.use(function (req, res, next) {
  // I'm hook 1, I won't do anything.
  next()
})

app.use(function (req, res, next) {
  // I'm hook 2, I'll break the chain
  res.send('Oops! Broke at hook 2')
})

app.get('/', function (req, res) {
  // Handler for path /
  // We responsed the user at hook 2,
  // so requests would never reach this handler
  res.send('You\'ll never see this')
})

PS:十分喜欢 SegmentFault 的文字样式和 GFM,顿时充满了编写回答的欲望啊~

推荐答案

3

先给纠正一下,你示例中的这个这个代码是不对的:

function checkLogin(req, res, next) {
    if (!req.session.user) {
      req.flash('error', '未登录!'); 
      res.redirect('/login');
      // 这里应该加个 return ,否则会出错(即 res.redirect() 和 next()不能同时执行)
    }
    next();
}

或者写成:

function checkLogin(req, res, next) {
    if (!req.session.user) {
      req.flash('error', '未登录!'); 
      res.redirect('/login');
    } else {
      next();
    }
}

以下代码的用法不是JavaScript或者Node.js的语法糖,仅仅是Express.js的一个特性而已,与语法什么的没有任何关系:

app.get('/reg', checkNotLogin);
app.get('/reg', function (req, res) {
    res.render('reg', {
      title: '注册',
      user: req.session.user,
      success: req.flash('success').toString(),
      error: req.flash('error').toString()
    });
});

与下面这样的写法作用是一样的:

app.get('/reg', checkLogin, function (req, res) {
    res.render('reg', {
      title: '注册',
      user: req.session.user,
      success: req.flash('success').toString(),
      error: req.flash('error').toString()
    });
});

另外提醒一下, 贴代码时要注意一下格式,缩进神马的不要搞错