来自Java。正在搞乱ExpressJS,我发送一个next()之后返回一个函数如果我不添加返回,那么next()函数在调用next()后仍然执行代码,当前它工作,返回转义这个行为,但我想知道这是否是正确的方法,或者我是在开发糟糕的习惯。在代码序列方面,在next()之后没有什么是真的。
function('/login', (req,res, next) => {
User.findOne({
email: username
}, (err, user) => {
if (user) {
var validPassword = user.comparePassword(password);
if (validPassword) {
let token = Helpers.getJwt(user);
res.send({
success: true,
message: 'Successful Login',
token: token
})
} else {
next(
Boom.badRequest('Invalid Credentials.', {
success: false,
message: 'Credentials did not match our records.'
}));
return;
}
} else {
next(
Boom.badRequest('User not found.', {
success: false,
message: 'User was not found, please register.'
}));
return;
}
});
编辑:我使用next(),我的错误中间件调用了中间件。
答案 0 :(得分:2)
首先,你不是在这里做任何事情(双关语)。
如果在特定路线或一组路线app.use(middleware:function)
的链中存在另一个中间件:功能,则调用中间件:next()函数。
示例:
app.get('/user/:id', function (req, res, next) {
console.log('ID:', req.params.id)
next()
}, function (req, res, next) {
res.send('User Info')
})
我建议你阅读Express Middlewares。
所以是的,你想在继续请求之前检查用户是否有效。
下面的代码只是解释中间件的工作原理: 我们的想法是,一个中间件:function 处理请求并将控制权传递给链中的下一个函数。
我假设您的Boom.badRequest只生成一个json有效负载,例如{};
所以这可能是一种实现你想要的优雅方式,但是我不确定这样做是否理想,也许更适合检查用户的令牌是否有效。
app.post('/login', /*MiddleWare Function*/(req, res, next) => {
User.findOne({email: username}, (err, user) => {
if (user) {
const validPassword = user.comparePassword(req.body.password);
if (!validPassword) return res.status(401).send(Boom.badRequest('User not found.', {
success: false,
message: 'User was not found, please register.'
}));
req.token = Helpers.getJwt(user);
next();// it will move execution to the next function we have below
} else {
res.status(401).send(Boom.badRequest('User not found.', {
success: false,
message: 'User was not found, please register.'
}));
//no need to next here.
}
})
}, /*OUR NEXT FUNCTION*/(req, res) => {
res.send({
success: true,
message: 'Successful Login',
token: req.token//notice that our token can be retrieved here
})
});
因此,一般来说,您可能只想拥有一个中间件:首先在特定路径组上调用的函数。
app.use(['/users*', '/logout'], (req, res, next) => {
/*
* What this means is that for every request that maps to /users
* or /logout this middleware:function will be called first.
*/
//we can check|test if this visitor has valid credentials.
next();//passes control to app.get('/users/whatEverItIS?') or app.post('/logout');
});
app.post('/users/whatEverItIs', (req, res)=>{
res.send("I passed the middleware test that is why im called");
});
答案 1 :(得分:0)
不需要return
语句。首先,由于您没有返回任何内容,其次是因为您使用next
方法将控制权传递给下一个中间件,因此返回在那里没用,并且将返回undefined
。