【问题标题】:How to create http.get synchronised function in node js如何在节点 js 中创建 http.get 同步函数
【发布时间】:2019-12-23 19:32:06
【问题描述】:

我正在尝试使用 node js (v6.14.3) 为我的项目创建函数文件。

从测试文件中,我使用“require”来调用我的 helper.js 文件(函数文件),并访问我创建的 gethttp 函数。 首先我尝试使用 async/await,然后意识到它在旧版本中使用。

我看到我需要使用承诺/回调,但不明白如何。

helper.js:

const http = require('http');
module.exports.gethttp = function(url){
    http.get(url, (resp) =>{
        let data = '';
         resp.on('data', (chunk) =>{
             data += chunk;
         });
         resp.on('end', (data) =>{
             return data;
         });
    }).on('error',  (err) =>{
        console.log(err);
    });
}

test.js:

var helper = require('./helper');
var req = helper.gethttp("the url");
console.log(req);

并获得未定义的输出...

【问题讨论】:

  • 为什么在gethttp 中你会在回调中返回你的值?回调是另一个范围。您不能在函数的输出中返回异步操作在函数内部返回的结果。你最好回报一个承诺。
  • 要从异步操作返回数据,请参阅How do I return data from an asynchronous call。可能您想使用 request-promise 模块,因为它已经为您收集了 http 响应并返回了一个承诺,该承诺允许您从函数中返回它,而调用者用户承诺获取数据。你不能从你的函数中返回数据。您的函数在数据完成到达之前很久就返回了。

标签: node.js


【解决方案1】:

我没有测试过这段代码,但这就是想法。

module.exports.gethttp = function(url){
    return new Promise((resolve, reject) => {
        http.get(url, (resp) =>{
            let data = '';
             resp.on('data', (chunk) =>{
                 data += chunk;
             });
             resp.on('end', (data) =>{
                 resolve(data);
             });
        }).on('error',  reject);
    });
}

然后像这样调用你的函数

var helper = require('./helper');
var req = helper.gethttp("the url").then((data)=>{
    console.log(data);
}).catch((err)=>{
    console.error(err);
})

或者只是

var helper = require('./helper');
var req = await helper.gethttp("the url");

【讨论】:

    【解决方案2】:

    你可以使用内部使用http模块的request promise模块,并返回一个promise,所以我们可以在这里使用async await。

    const rp = require('request-promise');
    module.exports.gethttp = async (url) => {
        const response = await rp(url);
        return response;
    }
    

    写了一个自执行函数,因为 await 只能用在异步函数中。

    var helper = require('./helper');
    (async () => {
    var res = await helper.gethttp("the url");
    console.log(res);
    })();
    

    【讨论】:

    • 我知道异步不能使用这个版本的节点。我尝试了您的代码并得到了“意外令牌”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多