使用 Node.JS 从一个函数返回值到另一个函数

Posted

技术标签:

【中文标题】使用 Node.JS 从一个函数返回值到另一个函数【英文标题】:Return value from one function to another with Node.JS 【发布时间】:2015-07-16 00:01:03 【问题描述】:

我正在使用 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 查询,但这有点多余。

即使是我用谷歌搜索的特定关键字也肯定会有很大帮助,因为我不知道我应该寻找什么。原因是因为我是 NodeJS 新手,所以我还不熟悉大部分术语。

我认为这些代码应该足够了,但如果需要我提供更多,请告诉我,我会这样做。提前致谢!!

【问题讨论】:

【参考方案1】:

要将控制权传递给下一个匹配的路由,您需要使用 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);

【讨论】:

我应该在哪里放置传递用户值的语法,以便 loginCheck 函数能够访问它?还是由于 next 关键字已经可以访问? 如果您在路由中指定了 2 个函数,并且当您在第一个函数中调用 next 时没有错误,则会将控制权转移到下一个函数。 verifyCredentials 函数放在哪里,谁调用了这个函数? passport.use(new LocalStrategy(verifyCredentials));上述路由使用了verifyCredentials函数。 我设法用你@Talgat 的方式得到了它。非常感谢。

以上是关于使用 Node.JS 从一个函数返回值到另一个函数的主要内容,如果未能解决你的问题,请参考以下文章

从函数发送值到另一个VC,swift3

使用带有 Node.js 的 AWS Lambda 函数从 S3 存储桶中提取 zip 文件并上传到另一个存储桶

在 node.js 中承诺一个递归函数

Node.js 从函数返回一个承诺

从选择返回值到函数

如何从 dispatch_sync(dispatch_get_main_queue(), 发送/返回值到另一个页面