【问题标题】:Returning Promise { undefined } in NodeJS when making a function call调用函数时在 NodeJS 中返回 Promise { undefined }
【发布时间】:2021-09-16 16:08:58
【问题描述】:

我正在尝试调用一个函数并等待该函数获取数据,然后再执行进一步的语句。我是 node js 和 async/await 和 promises 的新手。我尝试了一些解决方案,但没有奏效,它总是返回 Promise { undefined }。

如果我在不使用单独函数的情况下运行代码,它可以正常工作。但我必须在这里使用函数来连接数据库。

这是我的代码。

db.js

const mongoClient = require('mongodb').MongoClient;

const db_url = "mongodb_url";
const database_name = "mydb";

module.exports.GetAllUsersData = async function (){
    mongoClient.connect(db_url,{ useUnifiedTopology: true },function(err,dbserver){
        if(err) throw err;
        var mydb = dbserver.db(database_name);
        mydb.collection('users').find({}).toArray(function(err,results){
            console.log(results); //I am getting data here
            return Promise.resolve(results);
            
        });
    });
}

app.js

const express = require('express');

const db = require('./db.js');

//
const app = express();
app.set(express.static('public'));
app.set('view engine','ejs');
var urlencodeparser = express.urlencoded({extended:false});


app.get('/',function(req,res){
   
    var results =  db.GetAllUsersData();
    results.then(console.log(results)); //getting promise {undefined} here
    res.render('home.ejs',{users:results})
})

console.log('connected...')
app.listen(9000);

【问题讨论】:

  • 您确定要在单个查询之前进行连接吗?为什么不在进程开始时连接一次?无论如何,您只是将您解决的承诺返回到 connect 中的封闭范围,这将被忽略。像这样组合回调和承诺模式并不是一个好主意。
  • 请您建议我如何使用它
  • 我建议在流程开始时连接到您的数据库,除非您有充分的理由不这样做。如果你这样做了,这里的嵌套回调/承诺问题就不再是问题了。
  • 谢谢,我会尝试这样做。你对承诺 {undefined} 有什么意见吗?我无法在我的 app.js 中获取数据
  • 是的,你的函数是async,它总是返回一个promise,当控制到达函数的末尾时,它会自动返回未定义,因此是你的结果。我了解您无法获取数据,我解释了原因:return Promise.resolve(results) 不会将数据发送到任何有用的地方。你可以用return new Promise((resolve, reject) => /* your whole function body */ ); 包裹整个东西并调用resolve(results),但这是pretty awful place to be。

标签: node.js mongodb async-await node-promisify


【解决方案1】:

您可以通过如下重写GetAllUserData 函数来使其工作:

module.exports.GetAllUsersData = function () {
    return new Promise((resolve, reject) => {
        mongoClient.connect(db_url,{ useUnifiedTopology: true },function(err,dbserver){
            if(err) reject(err);
            var mydb = dbserver.db(database_name);
            mydb.collection('users').find({}).toArray(function(err,results){
                console.log(results); //I am getting data here
                resolve(results);                
            });
        });
    });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-27
    • 2018-07-09
    • 1970-01-01
    • 2022-12-07
    • 2021-05-31
    • 2020-11-28
    • 1970-01-01
    相关资源
    最近更新 更多