Javascript 如何将查询结果推送到node.js中的数组变量?

Javascript 如何将查询结果推送到node.js中的数组变量?,javascript,arrays,node.js,mongodb,loops,Javascript,Arrays,Node.js,Mongodb,Loops,我正在使用Node.js和MongoDB atlas,这是一个在线数据库。我已经与MongoDB atlas建立了连接,并向数据库发送了一个查询并检索了一个集合。返回集合时没有任何错误。现在我试图将查询结果推送到一个数组中,但该数组仍然是空的 我尝试使用console.log(),我看到循环后数组变为空。我注意到第二个console.log之前已经打印过了。我不知道为什么 const mongoose = require('mongoose'); var data = function ()

我正在使用Node.js和MongoDB atlas,这是一个在线数据库。我已经与MongoDB atlas建立了连接,并向数据库发送了一个查询并检索了一个集合。返回集合时没有任何错误。现在我试图将查询结果推送到一个数组中,但该数组仍然是空的

我尝试使用console.log(),我看到循环后数组变为空。我注意到第二个console.log之前已经打印过了。我不知道为什么

const mongoose = require('mongoose');

var data = function () {

    var array = [];

    mongoose.connection.collection("organizations").find({}).toArray(function(err, result) {
        if (err) throw err;

        for(var i = 0; i < result.length; i++)
        {
            var a = result[i].name;
            array.push(a);
            console.log(array[i]); //this shows that the array is getting filled and the result is printed correctly.
        }

    });

    console.log(array); //this shows only [] meaning that the array is now empty.
                        //this is shown in the log before the first log
    return array;
};

module.exports = {
    data: data,
};
const mongoose=require('mongoose');
变量数据=函数(){
var数组=[];
mongoose.connection.collection(“组织”).find({}).toArray(函数(err,result){
如果(错误)抛出错误;
对于(变量i=0;i
toArray是异步的-您的控制台。在toArray调用发生之前记录空数组。试试这个:

const mongoose=require('mongoose');
变量数据=异步函数(){
const array=wait mongoose.connection.collection(“组织”).find({}).toArray(函数(err,result){
如果(错误)抛出错误;
返回result.map(r=>r.name);
});
console.log(array);//这只显示[],表示数组现在为空。
//这显示在第一个日志之前的日志中
返回数组;
};
module.exports={
数据:数据,
};

toArray是异步的-您的控制台。在toArray调用发生之前记录空数组。试试这个:

const mongoose=require('mongoose');
变量数据=异步函数(){
const array=wait mongoose.connection.collection(“组织”).find({}).toArray(函数(err,result){
如果(错误)抛出错误;
返回result.map(r=>r.name);
});
console.log(array);//这只显示[],表示数组现在为空。
//这显示在第一个日志之前的日志中
返回数组;
};
module.exports={
数据:数据,
};

您无法从异步回调返回,这里的
。toArray()
是一个回调

因此,修改您的代码以传入一个回调函数,您可以发送结果

假设这是在
mongooseModule.js中编写的

const mongoose = require('mongoose');

var data = function (callback) {

    var array = [];

    mongoose.connection.collection("organizations").find({}).toArray(function(err, result) {
        if (err) throw err;

        for(var i = 0; i < result.length; i++)
        {
            var a = result[i].name;
            array.push(a);
            console.log(array[i]); //this shows that the array is getting filled and the result is printed correctly.
        }

        callback(array);
    });
};

module.exports = {
    data: data,
};

您不能从异步回调返回,这里的
。toArray()
是一个回调

因此,修改您的代码以传入一个回调函数,您可以发送结果

假设这是在
mongooseModule.js中编写的

const mongoose = require('mongoose');

var data = function (callback) {

    var array = [];

    mongoose.connection.collection("organizations").find({}).toArray(function(err, result) {
        if (err) throw err;

        for(var i = 0; i < result.length; i++)
        {
            var a = result[i].name;
            array.push(a);
            console.log(array[i]); //this shows that the array is getting filled and the result is printed correctly.
        }

        callback(array);
    });
};

module.exports = {
    data: data,
};

创建连接和从表中获取信息是异步操作。完成请求可能需要时间。因此,您可以使用
async/await
promise
处理异步操作,如下所示

const mongoose = require('mongoose');
    var data = async function () {
         var array = [];
         const finalResults = await new Promise((resolve, reject) => {
            mongoose.connection.collection("organizations").find({}).toArray(function(err, result) {
              resolve(result);
           });
      });

     for(var i = 0; i < finalResults.length; i++)
     {
          var a = finalResults[i].name;
           array.push(a);
      }
        return array;
    };

    module.exports = {
        data: data,
    };
const mongoose=require('mongoose');
变量数据=异步函数(){
var数组=[];
const finalResults=等待新承诺((解决、拒绝)=>{
mongoose.connection.collection(“组织”).find({}).toArray(函数(err,result){
决心(结果);
});
});
对于(变量i=0;i

它可能会帮助您。

创建连接并从表中获取信息是异步操作。完成请求可能需要时间。因此,您可以使用
async/await
promise
处理异步操作,如下所示

const mongoose = require('mongoose');
    var data = async function () {
         var array = [];
         const finalResults = await new Promise((resolve, reject) => {
            mongoose.connection.collection("organizations").find({}).toArray(function(err, result) {
              resolve(result);
           });
      });

     for(var i = 0; i < finalResults.length; i++)
     {
          var a = finalResults[i].name;
           array.push(a);
      }
        return array;
    };

    module.exports = {
        data: data,
    };
const mongoose=require('mongoose');
变量数据=异步函数(){
var数组=[];
const finalResults=等待新承诺((解决、拒绝)=>{
mongoose.connection.collection(“组织”).find({}).toArray(函数(err,result){
决心(结果);
});
});
对于(变量i=0;i

它可能会对您有所帮助。

您无法从异步回调返回,此处为
。toArray()
是一个回调,它是获取集合的异步操作。可以考虑使用<代码>异步/等待< /COD>function@KunalMukherjee他没有从回调中返回任何内容,他只是在按数组。您无法从异步回调中返回,这里的
。toArray()
是一个回调,它是获取集合的异步操作。可以考虑使用<代码>异步/等待< /COD>function@KunalMukherjee他没有从callback返回任何内容,他只是推到array
toArray()
在您的答案中的代码中也使用了“callback”。因此,您不能等待“回调”。
toArray()
在您的答案中的代码中也使用了“回调”。因此,您不能等待
一个“回调”。我已经尝试了这个解决方案,它似乎有效,但当我将它发送到视图时,页面不会显示结果,因为它在返回数组之前加载。有没有办法让页面等待结果?是否使用react?不只是一个简单的node.js和mongoose。在我的路由器中,这行代码如下所示:router.get('/register',(req,res)=>res.render('register',{data:organizations.data()}));在呈现视图之前打印此函数的返回响应,并查看响应是否即将到来,或者实际上您返回的函数不是数据,您必须调用