用Node.JS将一个函数的值返回给另一个函数
我正在使用MEAN堆栈的login界面。 我设法使用PassportJS来运行它。 我现在的问题是我需要一种方法让我的客户端知道login的用户是pipe理员还是用户(用户angular色)。 这些信息可以从我的MongoDB中获得。
我的API调用stream程如下:
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查询,但这样做有点多余。
即使是一个特定的关键字对我来说,谷歌肯定会有很大的帮助,因为我不知道我应该寻找什么。 原因是因为我是NodeJS的新手,所以我不熟悉大部分的术语。
我认为这些守则应该足够,但如果我需要提供更多,请告诉我,我会这样做。 提前致谢 !!
要将控制权传递给下一个匹配路由,您需要使用next
作为路由中第三个parameter passing的路由:
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);