使用express.js打破程序流程

时间:2014-11-13 13:02:28

标签: javascript node.js express

我想知道打破程序流程并重定向到某条路径的正确方法是什么。

类似于标题重定向,但使用路由名称而不是完整的URL。

这非常common to be found in PHP frameworks而且相当强大,我还没有找到使用express.js的方法。

想象一下这种情况:

function getUser() {
    //...
    //getting user..

    //Here I would like to break the flow of the program
    if (error) {
        res.redirect('add');
    }

    //If there was no error we keep the normal flow
    //...
}


router.get('/add', function (req, res, next) {
    var user = getUser();
    var date = //whatever
    var type = //whatever

    var event = createEvent(user, date, type);

    res.render('add', {
        date: date,
        type: type,
        whatever: whatever,
        csrfToken: req.csrfToken(),
        message: req.flash('error')
    });
});

正常的render不会是我想要的,因为我不想再次获取渲染视图所需的所有变量,我想要我想要重定向的路线处理它。

我在考虑使用writeHead,但这需要整个网址,而不仅仅是路由网址。

有任何想法或建议吗?

1 个答案:

答案 0 :(得分:1)

您可以从false返回nullgetUser()或其他值来表示休息。或者检查回复的状态(例如,检查res._headerSent === trueres.finished === true)。

另一种可能性是考虑使getUser()成为中间件功能。例如:

function getUser(req, res, next) {
  // ...

  if (error)
    return res.redirect('add');

  // If there was no error we keep the normal flow
  // ...

  // you would add user data to `req` here instead of returning it
  req.user = ...

  next();
}

router.get('/add', getUser, function(req, res, next) {
    var user = req.user;
    var date = //whatever
    var type = //whatever

    var event = createEvent(user, date, type);

    res.render('add', {
      date: date,
      type: type,
      whatever: whatever,
      csrfToken: req.csrfToken(),
      message: req.flash('error')
    });
});