Express 下一次之后快速返回()
来自爪哇。在处理ExpressJS时,如果我不添加返回,我会在发送next()后从函数中返回,然后调用next()时,next()函数后的代码仍会执行,目前它可以工作,return会逃避这种行为,但我想知道这是否是正确的方法,还是我开发了坏习惯。就代码顺序而言,next()之后没有任何内容Express 下一次之后快速返回(),express,Express,来自爪哇。在处理ExpressJS时,如果我不添加返回,我会在发送next()后从函数中返回,然后调用next()时,next()函数后的代码仍会执行,目前它可以工作,return会逃避这种行为,但我想知道这是否是正确的方法,还是我开发了坏习惯。就代码顺序而言,next()之后没有任何内容 function('/login', (req,res, next) => { User.findOne({ email: username }, (err, user) => {
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()调用了中间件,这是我的错误中间件。不需要
return
语句。首先是因为您没有返回任何内容,其次是因为您正在使用next
方法将控制权传递给下一个中间件,因此返回在那里是无用的,并且将返回未定义的,返回语句是不必要的。首先是因为您没有返回任何内容,其次是因为您正在使用next
方法将控制权传递给下一个中间件,因此该返回在那里是无用的,并且将返回未定义的,首先,您在这里不是下一个对象(双关语)
如果在特定路由链或一组路由app.use(middleware:function)
中存在另一个中间件:function,则调用middleware:next()函数
例如:
app.get('/user/:id', function (req, res, next) {
console.log('ID:', req.params.id)
next()
}, function (req, res, next) {
res.send('User Info')
})
我建议你读快报
因此,是的,您希望在继续请求之前检查用户是否有效
下面的代码只是解释中间件是如何工作的:
其思想是,一个中间件:函数处理请求,并将控制传递给链中的下一个函数
我假设您的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");
});
首先,在这里,你不是在谈论任何事情(双关语)
如果在特定路由链或一组路由app.use(middleware:function)
中存在另一个中间件:function,则调用middleware:next()函数
例如:
app.get('/user/:id', function (req, res, next) {
console.log('ID:', req.params.id)
next()
}, function (req, res, next) {
res.send('User Info')
})
我建议你读快报
因此,是的,您希望在继续请求之前检查用户是否有效
下面的代码只是解释中间件是如何工作的:
其思想是,一个中间件:函数处理请求,并将控制传递给链中的下一个函数
我假设您的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");
});
你下一步要干什么?我不明白你为什么要从一条路线上回来。在像Spark Framework()这样的Java框架中也不会这样做。现在还不清楚你的目标/问题是什么。至少可以说,从路线返回是非常罕见的。一个.catch()
在代码中做什么?您使用的是.findOne()
的回调接口,而不是promise接口。你需要始终如一。要么只使用承诺,要么只使用简单的回调。不能把两者混为一谈。你下一步打算干什么?我不明白你为什么要从一开始就离开一条路线。在像Spark Framework()这样的Java框架中也不会这样做。现在还不清楚你的目标/问题是什么。至少可以说,从路线返回是非常罕见的。一个.catch()
在代码中做什么?您使用的是.findOne()
的回调接口,而不是promise接口。你需要始终如一。要么只使用承诺,要么只使用简单的回调。不能将两者混用。嘿,我确实有一个中间件,它只是不包含在代码段中。@TaranjitKang这意味着您没有阅读过express中间件和下一个函数的用法。从您的代码段中,您正在调用下一个,因此问题是您下一个要调用的其他函数是什么?。您在其中调用下一个函数的函数用作中间件。嘿,我有一个中间件,它只是不包括在代码段中。@TaranjitKang这意味着您没有阅读express中间件和下一个函数的用法。从您的代码段中,您正在调用next,因此问题是您下一步要调用的是什么其他函数?。在其中调用next的函数用作中间件。但是,调用next()后的代码仍然运行而不返回值。但是,调用next()后的代码仍然运行而不返回值。