如何在节点JS中的本地变量中存储GET请求的响应

She*_*yed 6 get node.js

我知道使用该request模块向URL发出GET请求的方法.最终,代码只是在命令shell中打印GET响应,从中生成它.

如何将这些GET响应存储在本地变量中,以便我可以在程序中的其他位置使用它?

这是我使用的代码:

var request = require("request");
request("http://www.stackoverflow.com", function(error, response, body) {
    console.log(body);
}); 
Run Code Online (Sandbox Code Playgroud)

Tro*_*ott 14

最简单的方法(但它有陷阱 - 见下文)是body进入模块的范围.

var request = require("request");
var body;


request("http://www.stackoverflow.com", function(error, response, data) {
    body = data;
});
Run Code Online (Sandbox Code Playgroud)

但是,这可能会鼓励错误.例如,您可能倾向于console.log(body)在通话结束后立即投入request().

var request = require("request");
var body;


request("http://www.stackoverflow.com", function(error, response, data) {
    body = data;
});

console.log(body); // THIS WILL NOT WORK!
Run Code Online (Sandbox Code Playgroud)

request()是行不通的,因为它是异步的,所以它body在回调中设置之前返回控制.

通过创建body事件发射器和订阅事件可能会更好.

var request = require("request");
var EventEmitter = require("events").EventEmitter;
var body = new EventEmitter();


request("http://www.stackoverflow.com", function(error, response, data) {
    body.data = data;
    body.emit('update');
});

body.on('update', function () {
    console.log(body.data); // HOORAY! THIS WORKS!
});
Run Code Online (Sandbox Code Playgroud)

另一种选择是切换到使用promises.