适用于所有现有路线?

时间:2016-06-27 17:06:23

标签: node.js express

我必须使用我目前这样做的路线:

app.all('*', passport.authenticate('facebook-token',  { session: false }));

//Here goes specific routes.

app.get('/user/me',
    (req, res, next) => {
        next();
});

app.get('/user/makeRider',
    (req, res, next) => {
        req.user.user.makeRider(req.query)
            .then((user) => {
                next();
            });
    }
);

app.all('*', (req, res) => {
    req.user.user.full().then((fulluser) => {
        res.json({
            user: fulluser,
            params: req.query
        });
    });
});

他们负责我的REST-api中的身份验证和输出。这些路由的问题是它们使所有路由有效,从不抛出404:s。有没有更好的方法来做到这一点,而不是将功能添加到每条路线?

1 个答案:

答案 0 :(得分:1)

这不是Express常见的设置(Restify有一个选项,您可以调用next()将请求转移到特定路由,这将是您的输出处理程序,但是它的局限性。)

这是一种可能的解决方法。

首先,声明一个output中间件:

let outputMiddleware = (req, res) => {
  req.user.user.full().then((fulluser) => {
    res.json({
      user: fulluser,
      params: req.query
    });
  });
};

接下来,存储对Passport中间件的引用:

let authenticateMiddleware = passport.authenticate('facebook-token', { session: false });

创建一个包装函数将所有中间件函数链接在一起:

let chain = (fn) => [ authenticateMiddleware, fn, outputMiddleware ];

最后,声明你的路线:

app.get('/user/me', chain((req, res, next) => {
  next();
}));

这样做基本上是创建如下所示的路由处理程序:

app.get('/user/me', [
  passport.authenticate(...),
  (req, res, next) => { ...; next() },
  (req, res) => { ...; res.json(...) }
]);