node.js - 使用 Node.JS 将一个函数的值返回到另一个函数

标签 node.js mongoose passport.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));

一旦成功调用该函数,服务器就会执行它的第二部分,即登录检查。

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 作为路由中的第三个参数传递:

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);

关于node.js - 使用 Node.JS 将一个函数的值返回到另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30066756/

相关文章:

passport.js - 如何使用带有 Passport 和快速 session 的订阅传输 ws

node.js - 尝试从 Node 生成 ruby​​ sass

node.js - Elastic Search 唯一约束

mongodb - mongo _id 字段重复键错误

node.js - 一旦保存在 Mongoose 中,如何使某些字段不可更新?

javascript - 在 nodejs 身份验证中使用 Passport 替代 findById?

javascript - JavaScript 中的变量名拼写检查

javascript - 模块的 Node 模块多个调用方向

node.js - Mongoose - 默认值定义中的依赖关系

node.js - Passport Node.js 本地身份验证不起作用