素材牛VIP会员
想请问一段node代码,有点不太明白这个写法
 被***师  分类:Node.js  人气:954  回帖:4  发布于2年前 收藏

首先定义了一个函数

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()
    });
});

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

 标签:node.jsjavascript

讨论这个帖子(4)垃圾回帖将一律封号处理……

Lv2 入门
阿***逗 移动开发工程师 2年前#1

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

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()
    });
});

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

Lv6 码匠
明***e 交互设计师 2年前#2

你定义的是checkLogin还是checkNotLogin额.. 还有你到底哪里没明白了? 如果你是说/reg匹配了多个函数的话请自觉看checkLogin的倒数第二行next();,这个的作用就是当有多个匹配的时候再执行完一个的时候不做跳转继续进行下一个匹配的操作。 链接的话你可以谷歌一下,郭家宝的Node.js入门那本书上也有写这个(《Node.js开发指南》95页-96页:控制权转移)。


如果不是的话就请忽略我的答案吧╮(╯▽╰)╭

Lv5 码农
wz***16 技术总监 2年前#3

RESTful ...你大概是这个意思?

Lv4 码徒
25***om UI设计师 2年前#4

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,顿时充满了编写回答的欲望啊~

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取