我如何从Node.JS中的另一个文件获取数组数据

用户名

我正在创建与MongoDB一起使用的Node项目。我有两个文件,例如change_language.jsadmin_event.js我在change_language.js文件中创建了一个函数,并从其他文件(admin_event.js)中调用了该函数

change_language.js

const express = require("express");
const router = express.Router();
const mongoose = require("mongoose");
var assert = require('assert');
const request = require("request");
const Entity_option = require("../models/entity_option");
var ObjectId = require('mongodb').ObjectID;
require("../routes/admin_event");

function change_language(language_id)
{
      let myRes=[];
      Entity_option.aggregate([
        {$match:{"language_id":ObjectId(language_id)}}

        ], function (err, result)
        {
            if (err)
            {
                myRes=err;
            }
            else
            {   
                myRes= result;  
            }
            console.log(myRes); // Print 1
        })
    return myRes;
}

module.exports.change_language = change_language;

admin_event.js

const express = require("express");
const router = express.Router();
const Event = require("../models/event");
const myLan=require("../setting/change_language").change_language;
var ObjectId = require('mongodb').ObjectID;

    let language_id="5b9f5b324ae85e12a869187c";

    let x = myLan(language_id);
    console.log(x); // Print 2

module.exports = router;

该功能按预期工作。console.log(myRes)(打印1行)在命令提示符下显示输出。但是当我从另一个文件(console.log(x)调用该函数时显示undefined为什么?

艾略特·布莱克本

正如@ ponury-kostek所说,这实际上与Node.js新手的一个常见问题重复。

该函数change_language是一个异步函数,但是您要在该异步任务有机会完成之前返回一个值。

什么是异步功能?传统上,Nodejs使用回调,您已经在这里进行了探讨,只是有些误解。

Entity_option.aggregate([{
  $match:{"language_id":ObjectId(language_id)}
}], function (err, result) {
  if (err) {
    myRes=err;
  }
  else {
    myRes= result;  
  }

  console.log(myRes); // => 1
})

在这里,我们正在进行一个函数调用,该函数返回一个回调。在主函数(Entity_option.aggregate)完成之前,不会调用此回调函数(带有错误和结果的函数)。这可以在任何时间进行,因此您不能依靠立即从包装器函数返回任何值。结果,我们需要使用一些嵌套的回调使所有代码异步。

在现有代码中,您尝试将myRes分配给result,但是return调用不在此回调之外,因此已在触发该回调之前进行了调用。这就是为什么你得到undefined基本上,您不是在等待异步任务完成。这就像将面包放到烤面包机中,将其推下,但立即尝试将烤面包归还。当然还没有准备好!

这是代码外观的示例。

change_language.js

// All your various requires etc...
function change_language(language_id, callback) {
  let myRes=[];
  Entity_option.aggregate([{
      $match:{"language_id":ObjectId(language_id)}
    }], function (err, result) {
        if (err) {
            myRes=err;
        } else {   
            myRes= result;  
        }

        callback(err, result);
    });
}

module.exports.change_language = change_language;

admin_event.js

const express = require("express");
const router = express.Router();
const Event = require("../models/event");
const myLan=require("../setting/change_language").change_language;
var ObjectId = require('mongodb').ObjectID;

let language_id="5b9f5b324ae85e12a869187c";

// Supply a callback as this is an async call
// the callback will be triggered once the async
// process (such as talking to a database) has finished
// or errored.
myLang(language_id, function(err, result) {
  let x = result;

  console.log(result);
});

module.exports = router;

如果这样做,您将很快看到回调样式代码的一些问题。因此,我建议您着眼于JavaScript“ Promises”和async / await,但这不在此问题的范围内。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我如何使用angular js在另一个HTML文件中使用从json响应中获取的数据

如何从另一个 .js 文件访问数组?

如何将数据添加到另一个文件变量中的数组?

如何从 React 中的另一个文件获取数据

如何从另一个Excel文件中获取数据并按名称对其进行排序?

React-如何将API数据从一个组件传递到另一个js文件中的另一个组件?

从另一个Node.js应用程序获取数据以将其保存在另一个数据库中

我如何从另一个文件获取链接?

Node.js如何从异步回调中返回数组以在另一个文件中使用

如何用javascript中获取的数据中的另一个数组替换整个数组

我如何在js中的另一个js文件中包含一个js文件

如何将我的获取请求分离到 react js 中的另一个文件

如何从循环(while)外的数组中获取单个数据以将该数据插入另一个表?

如何从另一个表中获取基于ID的一个表数据

嗨,我想获取一个json数据,并根据json链接中收到的数据发送另一个json数组

当我从另一个文件导入数组时,我是只从其中获取数据还是需要使用原始文件构建它的方式“构建”数组?

如何使用 stdClass 对象从另一个数组中的数组中获取值?

如何从另一个文件引用Node.js中的变量

reactjs中如何通过app.js将数据从一个js文件传递到另一个js文件

在另一个 JS 文件中调用全局函数。我如何让“这个”起作用?

如何获取JSON值并将其保存在JS中的另一个文件中

空手道-如何从响应中获取数据/通过运行另一个功能文件

如何使用一个表中的数据作为参考以使用 Firebase 获取另一个表中的另一个数据?

我如何从一个函数获取数据到另一个函数

如何在另一个数组中获取数组的索引值

如何获取另一个数组中不存在的数组值

如何使用数组从另一个数组中获取值?

如何基于存储在另一个数组中的索引获取数组的项目

如何从另一个函数中的异步获取中获取结果数据