【问题标题】:Node.js: unable to return value from other function inside same fileNode.js:无法从同一文件中的其他函数返回值
【发布时间】:2018-05-12 00:23:24
【问题描述】:

所以我有这个 MEAN-stack 应用程序,在后端,我有两种方法来创建新用户:通过 google 身份验证和通过用户名。

现在,我正在编写通过用户名创建新用户的代码,但我无法从我的 node.js 文件中的另一个函数返回值(在本例中为 createNewUser() )。当我查看我的数据库时,新用户已创建,但从 createNewUser() 返回的值未定义。

我首先认为这是由于异步性造成的问题,所以我尝试了 setTimeout()。然而,该函数仍然返回 undefined。有人知道为什么吗?

这是我的 node.js 后端中的路由:两个 console.logs 返回 undefined

router.post('/signup', function(req, res){


    var result = createNewUser(req.body);
    console.log('result 1', result);
    setTimeout(function(){
        console.log('result2', result);
        if (!result.success){
            res.status(500).json({
                message: "unable to create User",
                obj: result.err
            })
        } else {
            res.status(200).json({
                message: "successfully created new user",
                obj: result.obj
            })
        }
    }, 6000);

});

这是同一个文件中的createNewUser()函数,console.log返回的是用户,所以实际上是创建了用户,只是函数没有返回值。:

function createNewUser(userData, socialRegistry){

    var user;

    if (socialRegistry){
        user = new User({
            firstName: userData.firstName,
            lastName: userData.lastName,
            email: userData.body.email,
            googleID: userData.body.provider.ID
        });
    } else {
        user = new User({
            firstName: userData.firstName,
            lastName: userData.lastName,
            username: userData.username,
            password: bcrypt.hashSync(userData.password, 10),
            email: userData.email,
            registerDate: new Date()
        });
    }

    user.save(function(err, user) {
        if (err) {
            return {
                success: false,
                err: err
            }
        }
        if (socialRegistry){
            return user
        } else {
            console.log(user);
            var test = {
                success: true,
                obj: user
            }

            return test
        }
    });
}

【问题讨论】:

标签: javascript node.js mongoose


【解决方案1】:

虽然我同意这是一个基本的异步问题,但上面规定的链接以非常笼统的方式回答了它,坦率地说,这里是这个问题的 TLDR。

由于您的流程(如保存)是异步的,因此您不能只返回一些内容。相反,将闭包/函数传递给代码,并在事情完成后调用该函数。大多数 Node 都基于这种用法,原因是 TLDR 在此处列出。

createNewUser(req.body,null,function(result){
    if (!result.success){
            res.status(500).json({
                message: "unable to create User",
                obj: result.err
            })
        } else {
            res.status(200).json({
                message: "successfully created new user",
                obj: result.obj
            })
        }
});

function createNewUser(userData, socialRegistry, onComplete){
 ....
    user.save(function(err, user) {
        if (err) {
            onComplete({
                success: false,
                err: err
            })
        }
        if (socialRegistry){
            onComplete(user)
        } else {
            onComplete({
                success: true,
                obj: user
            })
        }
    });
}

有些答案对后代很有帮助,这可能不是其中之一,但简单中蕴含着力量。


哦,为了回答您在帖子中发布的问题之一,“结果”从未设置为任何内容的原因是您的函数已经完成并且在异步调用 user.save( )。

【讨论】:

  • 这很有帮助。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-12-17
  • 2015-09-23
  • 2021-08-16
  • 1970-01-01
  • 2021-06-17
  • 2014-06-13
  • 1970-01-01
  • 2013-04-22
相关资源
最近更新 更多