Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为mongodb中的操作生成函数_Javascript_Node.js_Mongodb - Fatal编程技术网

Javascript 为mongodb中的操作生成函数

Javascript 为mongodb中的操作生成函数,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我需要做一个这样的函数 function getDataFromCollection(collectionName) { let data; MongoClient.connect(url, function(err, db) { if (err) throw err; db.collection(collectionName).find({}).toArray(function(err, result) { data =

我需要做一个这样的函数

function getDataFromCollection(collectionName) {
    let data;

    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        db.collection(collectionName).find({}).toArray(function(err, result) {
            data = result;
            console.log(result);
            db.close();
        });
    });

    return data;
}

问题是数据是未定义的,但当我执行console.log(result)时,它可以工作。有什么办法帮我吗。提前谢谢。

这里有一个非常简单的解释。
函数(err,result)
本质上是异步的,不会立即调用,而是在从mongo获取数据一段时间后调用。因此,
函数(err,result)
是一个回调函数。因此,
数据
不会设置为立即生成,而是在一段时间后生成。现在,您可以立即返回数据,而不必等待数据被填充(在
函数(err,result)
回调中),因此
未定义的
显然会被返回

解决方案是使用JavaScript的
承诺
,它允许您使用异步代码和回调。我们从
getDataFromCollection
返回一个
Promise
,并链接一个
。然后调用它时将其链接起来。传递给
然后
的函数或回调在
getDataFromCollection
函数中解析承诺时执行,该承诺包含传递给
resolve
函数的数据。因此,当您收到
结果时,
内部的回调将被调用

所有代码-

function getDataFromCollection(collectionName) {
        return new Promise(function(resolve, reject) {
            MongoClient.connect(url, function(err, db) {
                if (err) {
                  reject(err);
                  return; 
                }
                db.collection(collectionName).find({}).toArray(function(err, result) {
                    if (err) {
                       reject(err);
                       return;
                    }
                    console.log(result);
                    db.close();
                    resolve(result);
               });
           });
        });
    }
像这样使用函数

getDataFromCollection("collection")
   .then(function(result) {
      // use result
   })
   .catch(function(err) {
     console.log(err);
   });

从中阅读有关
承诺的内容

有一个非常简单的解释。
函数(err,result)
本质上是异步的,不会立即调用,而是在从mongo获取数据一段时间后调用。因此,
函数(err,result)
是一个回调函数。因此,
数据
不会设置为立即生成,而是在一段时间后生成。现在,您可以立即返回数据,而不必等待数据被填充(在
函数(err,result)
回调中),因此
未定义的
显然会被返回

解决方案是使用JavaScript的
承诺
,它允许您使用异步代码和回调。我们从
getDataFromCollection
返回一个
Promise
,并链接一个
。然后调用它时将其链接起来。传递给
然后
的函数或回调在
getDataFromCollection
函数中解析承诺时执行,该承诺包含传递给
resolve
函数的数据。因此,当您收到
结果时,
内部的回调将被调用

所有代码-

function getDataFromCollection(collectionName) {
        return new Promise(function(resolve, reject) {
            MongoClient.connect(url, function(err, db) {
                if (err) {
                  reject(err);
                  return; 
                }
                db.collection(collectionName).find({}).toArray(function(err, result) {
                    if (err) {
                       reject(err);
                       return;
                    }
                    console.log(result);
                    db.close();
                    resolve(result);
               });
           });
        });
    }
像这样使用函数

getDataFromCollection("collection")
   .then(function(result) {
      // use result
   })
   .catch(function(err) {
     console.log(err);
   });

从中阅读有关
承诺的内容

为什么不使用
返回结果
res.json(result)
(如果您使用的是express)?我应该在其中写入返回结果,而不是
data=result
console.log(result)
但如果您需要将结果分配给
数据
变量,请尝试这样做:这样可以工作,但我不需要函数,我必须复制粘贴这段代码,无论在何处,为什么不使用
返回结果
res.json(结果)
(如果您使用express)?我应该在哪里写返回结果,而不是
data=result
console.log(result)
但如果您需要将结果分配给
data
变量,请尝试这样做:这将起作用,但这样我不需要函数,我必须复制粘贴这段代码