Return 从一个函数到另一个函数的值 Node.JS
Return value from one function to another with Node.JS
我正在使用 MEAN 堆栈开发登录界面。我已经设法让它使用 PassportJS 工作。我现在的问题是我需要一种方法让我的客户端知道登录的人是管理员还是用户(用户角色)。这些信息可以从我的 MongoDB 中获得。
我的 API 调用流程如下:
app.post('/login', passport.authenticate('local'), authRoutes.loginCheck);
首先,它运行 passport.authenticate 并调用下面的函数
function verifyCredentials(username, password, done) // username & password from what user provide when logging in
{
console.log('VC');
User.findOne({username: username}, function(err, user) //query Mongo
{
console.log(user); // User role is available here, in JSON format
if(user === null) // if no username in database, do this
{
console.log('Username does not exist in database');
}
else
{
user.comparePassword(password, function(err, match) // function written to compare hashed password in Mongo & password provided by user
{
if(match)
{
done(null, {id: username, name: username});
return user; // this is not the correct syntax, but the idea is, I want to send over the user details here, so I can access the role later
}
else
{
done(null, null);
}
});
}
});
}
使用此语法调用 verifyFunction。
passport.use(new LocalStrategy(verifyCredentials));
成功调用该函数后,服务器将执行它的第二部分,即 loginCheck。
module.exports.loginCheck = function(req, res)
{
console.log('Calling loginCheck route');
// I generate some sort of jwt token here
// payload, body, blah blah blah ...
console.log(req.body);
res.json({
authenticated: req.isAuthenticated(), //built-in authentication function, returns true or false
token: token // sends over token
role: user.role // want to send over something like this
}); // sends all these to client side as JSON
}
因为这两个函数在不同的文件中,我不清楚我是否必须要求某些东西或者只是将一个额外的参数传递给 loginCheck 函数。我试过后者,但没有用。
我能想到的一种方法是在 loginCheck 函数中执行另一个 Mongo 查询,但这有点多余。
即使是对我来说 google 的特定关键字也肯定会有很大帮助,因为我不知道我应该寻找什么。原因是因为我是NodeJS的新手,所以我对大部分术语还不熟悉。
我认为这些代码应该足够了,但如果我需要提供更多,请告诉我,我会这样做。提前致谢!!
要将控制传递给下一个匹配路由,您需要使用 next
作为路由中的第三个参数传递:
function verifyCredentials(req, res, next) {
User.findOne({username: req.body.username}, function(err, user) //query Mongo
{
if(user === null) {
return next(new Error('Username does not exist in database'));
} else {
user.comparePassword(req.body.password, function(err, match) {
if(match) {
next(null, {id: username, name: username});
} else {
next(new Error('not match'));
}
});
}
});
}
app.post('/login', verifyCredentials, authRoutes.loginCheck);
我正在使用 MEAN 堆栈开发登录界面。我已经设法让它使用 PassportJS 工作。我现在的问题是我需要一种方法让我的客户端知道登录的人是管理员还是用户(用户角色)。这些信息可以从我的 MongoDB 中获得。
我的 API 调用流程如下:
app.post('/login', passport.authenticate('local'), authRoutes.loginCheck);
首先,它运行 passport.authenticate 并调用下面的函数
function verifyCredentials(username, password, done) // username & password from what user provide when logging in
{
console.log('VC');
User.findOne({username: username}, function(err, user) //query Mongo
{
console.log(user); // User role is available here, in JSON format
if(user === null) // if no username in database, do this
{
console.log('Username does not exist in database');
}
else
{
user.comparePassword(password, function(err, match) // function written to compare hashed password in Mongo & password provided by user
{
if(match)
{
done(null, {id: username, name: username});
return user; // this is not the correct syntax, but the idea is, I want to send over the user details here, so I can access the role later
}
else
{
done(null, null);
}
});
}
});
}
使用此语法调用 verifyFunction。
passport.use(new LocalStrategy(verifyCredentials));
成功调用该函数后,服务器将执行它的第二部分,即 loginCheck。
module.exports.loginCheck = function(req, res)
{
console.log('Calling loginCheck route');
// I generate some sort of jwt token here
// payload, body, blah blah blah ...
console.log(req.body);
res.json({
authenticated: req.isAuthenticated(), //built-in authentication function, returns true or false
token: token // sends over token
role: user.role // want to send over something like this
}); // sends all these to client side as JSON
}
因为这两个函数在不同的文件中,我不清楚我是否必须要求某些东西或者只是将一个额外的参数传递给 loginCheck 函数。我试过后者,但没有用。
我能想到的一种方法是在 loginCheck 函数中执行另一个 Mongo 查询,但这有点多余。
即使是对我来说 google 的特定关键字也肯定会有很大帮助,因为我不知道我应该寻找什么。原因是因为我是NodeJS的新手,所以我对大部分术语还不熟悉。
我认为这些代码应该足够了,但如果我需要提供更多,请告诉我,我会这样做。提前致谢!!
要将控制传递给下一个匹配路由,您需要使用 next
作为路由中的第三个参数传递:
function verifyCredentials(req, res, next) {
User.findOne({username: req.body.username}, function(err, user) //query Mongo
{
if(user === null) {
return next(new Error('Username does not exist in database'));
} else {
user.comparePassword(req.body.password, function(err, match) {
if(match) {
next(null, {id: username, name: username});
} else {
next(new Error('not match'));
}
});
}
});
}
app.post('/login', verifyCredentials, authRoutes.loginCheck);