我必须使用我目前这样做的路线:
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。有没有更好的方法来做到这一点,而不是将功能添加到每条路线?
答案 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(...) }
]);