在 Node.js 中,如何在主应用程序中存储来自模块函数的回调数据?

丹妮尔

我制作了一个节点网络应用程序,它可以工作。但是,我将其构建为整体式,并且我正尝试将其分解为模块以进行练习。

长问题简而言之,在模块中,如何根据回调结果定义变量并以主应用程序可用的方式存储它?是否像将模块中的结果存储到全局变量并将其导出一样简单?

在我的整体版本中:

应用程序.js

var resultsArray = [];
function getDatafromHTTP(page){
    callback(data){
        resultsArray.push(data);//push json elements to array
        if(page < 50){page++;getDatafromHTTP(page);}
    }
}
getDatafromHTTP(0);
app.get(some function that displays the resultsArray)

getDatafromHTTP函数通过 page 变量运行 50 次。

现在我试图分解它:

应用程序.js

var resultsArray =[];
var getDatafromHTTP = require(module.js).getDatafromHTTP
getDatafromHTTP(0);
app.get(some function that displays the resultsArray)

模块.js

exports.getDatafromHTTP = function(page){
    callback(data){
        resultsArray.push(data);//push json elements to array
        if(page < 50){page++;getDatafromHTTP(page);}
    }
}
//error resultsArray not Defined.

我明白为什么 resultsArray 没有在模块中定义,并且明白我可以让 resultsArray 成为模块本身的变量。如果是返回,我会根据函数的返回在主应用程序中简单地定义一个变量。但是由于该函数通过回调而不是返回来获取数据,那么将数据返回到主应用程序并可供 app.get 函数使用的“正确”方法是什么?无论是在构建时,还是在 50 个函数运行完成后?

保罗

有许多不同的方法可以做到这一点,但我见过的最常见的模式是将值添加为 app(或类似的)的新属性。例如:

module.exports = function(app) {
  return function getHttpData(callback) {
    request.get('http://example.com/', (err, results, body) => {
      if (err) return cb(err);
      app.httpData = body;
      return cb(null, body);
    });
  }
}

然后在您的调用代码中,您将执行以下操作:

var app = express();
var getHttpData = require('./get-http-data.js')(app); // <-- note I'm passing the app object in here

// sometime later
getHttpData((err, data) => {
    console.log(data);
});

显然,我将省略一些步骤,例如一些 require 语句等,但希望您能理解。

综上所述,通常希望避免这样的全局变量。特别是,如果您的应用程序必须扩展到多个进程(应用程序的每个实例将单独获取,并且可能会以不同的状态结束),那么在内存中存储可能会发生类似变化的内容将在以后导致错误。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从 Node.Js 中的回调函数返回数据

如何在node.js中执行回调函数?

如何在回调函数Node JS中打破for循环

如何在node.js控制台应用程序中应用模块模式?

在Node.js回调中调用模块函数

如何在Node.js应用程序中需要其他模块

如何在使用群集模块的Node.js应用程序中运行Cron Job?

如何在Node.js模块中处理异步回调?

来自node.js的回调函数

从Angular应用程序调用Node.js中的函数

如何解决来自 Node.js 应用程序的外部 HTTP 请求中的错误

在Node.Js / Express应用程序中存储数据库配置的最佳方法

如何从Node.js中的其他应用程序注入模块

整合node.js模块导出中的多个回调

来自https响应的回调函数未在Node.js中触发

如何在Node.js和Express.js应用程序中设置HttpOnly标志?

如何在Windows IIS中托管React.js和Node.js应用程序?

如何在单页 Web 应用程序中处理 node.js 中的“发布”请求

TypeError:回调不是Node.js中的函数

Node js中的回调函数是否以同步方式执行?

从Node.js中的回调函数返回值

等待回调函数在Node.js中返回

Node.js中的回调函数没有结果

TypeError:回调不是Node.js中的函数

等待Google Cloud Functions(Node-JS)中的数据存储回调

模块化如何从技术上解决Node.js中的回调地狱

Node.js中的回调顺序

如何获取chart.js图表以在Node / React Web应用程序中显示数据?

无法使用 node.js 中的应用程序从扩展模块调用基本模块