javascript - 无法从 javascript 函数调用获取返回值

标签 javascript node.js express

我正在开发一个简单的 angular2/expressJS 应用程序。我在expressJS中有一个http get路由器调用,如下所示,它应该从mongoDB返回所有用户,并且效果很好:

app.get('/getusers', function(req, res) {

userModel.find({}, function(err, userlist) {
    if (err) return handleError(err);
    else {
        return userlist;
    }
});

现在我尝试将获取用户列表部分拆分为一个单独的函数,如下所示,以便可以重用。

app.get('/getusers', function(req, res) {
    var tmpUsrList = getAllUsers();
    console.log(tmpUsrList); //This prints undefined
    res.send(tmpUsrList);
});

function getAllUsers() {
    userModel.find({}, function(err, userlist) {
        if (err) return handleError(err);
        else {
            console.log(userlist); //This prints the correct list
            return userlist;
        }
    });
}

但是,返回后,该值变得未定义。我来自java背景,所以我可能会犯一些基本错误。感谢您的帮助!!

谢谢

最佳答案

您需要将其包装在这样的 promise 中:

app.get('/getusers', function(req, res) {
    getAllUsers()
    .then(tmpUsrList => {
        console.log(tmpUsrList);
        res.send(tmpUsrList);
    })
    .catch(err => handleError(err))
});

function getAllUsers() {
    return new Promise((resolve, reject) => {
      userModel.find({}, function(err, userlist) {
          if (err) return reject(err);
          // no need of else if you return
          console.log(userlist);
          resolve(userlist);
      });
    })
}

关于javascript - 无法从 javascript 函数调用获取返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44963301/

相关文章:

javascript - "display: none"被添加到谷歌地点自动完成输入字段

javascript - 从 javascript 调用不同的 PHP 函数

node.js - 是否有任何 Node.JS IDE 可以像 Node.js 控制台那样进行 REPL 交互并维护状态?

javascript - 并非 Meteor 项目私有(private)文件夹中的所有 Assets 都会自动部署到 ".meteor\local\build\programs\server\assets\app"

javascript - 平安 express + sequelize server with chai-http

node.js - req.params.number 是 expressjs 中的字符串?

javascript - 用于将子文档连接到其父文档的端点,不返回任何内容

javascript - 如何在 html 中使用 Handlebars

javascript - 删除输入 :style after click with jQuery 中的 attr

html - 如何在 nodejs 中通过 get 请求使用 req.body