无法使用async和await执行http请求

时间:2017-09-10 15:19:11

标签: node.js asynchronous

尝试使用asyncawait在nodejs中执行http请求,但收到错误。有任何想法吗? THX

got response: 
undefined
/home/tom/learn/node/node_modules/node-rest-client/lib/node-rest-client.js:539
            callback(parsedData,res);
            ^

TypeError: callback is not a function
    at /home/tom/learn/node/node_modules/node-rest-client/lib/node-rest-client.js:539:13
    at Object.parse (/home/tom/learn/node/node_modules/node-rest-client/lib/nrc-parser-manager.js:151:3)
    at ConnectManager.handleResponse (/home/tom/learn/node/node_modules/node-rest-client/lib/node-rest-client.js:538:32)
    at ConnectManager.handleEnd (/home/tom/learn/node/node_modules/node-rest-client/lib/node-rest-client.js:531:18)
    at IncomingMessage.<anonymous> (/home/tom/learn/node/node_modules/node-rest-client/lib/node-rest-client.js:678:34)
    at emitNone (events.js:110:20)
    at IncomingMessage.emit (events.js:207:7)
    at endReadableNT (_stream_readable.js:1059:12)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)

以下是脚本的源代码

var Client = require('node-rest-client').Client;
var client = new Client();
async function test1() {
    response = await client.get("http://localhost/tmp.txt");
    console.log("got response: ");
    console.log(response.headers);
};
test1();

nodejs的版本是v8.4.0,在ubuntu 14.04上。

3 个答案:

答案 0 :(得分:4)

async/await不要只是神奇地处理期望回调的函数。如果client.get()期望将回调作为参数,那么如果您要使用它,则必须传递回调。 async/await使用返回promise的异步操作,并对这些promise进行操作。他们不会神奇地让你跳过将回调传递给为回调设计的函数。我建议更多地了解如何实际使用asyncawait

通常,async/await的路径是首先设计所有async操作以使用promises和.then()处理程序。然后,在完成所有工作之后,您可以将函数声明为要使用等待的异步,然后在这些异步声明的函数中,您可以调用返回promises的函数,而不是使用.then()处理程序。这里没有神奇的捷径。从承诺设计开始。

这是一个简单的承诺示例:

// asynchronous function that returns a promise that resolves to
// the eventual async value
function delay(t, val) {
   return new Promise(resolve => {
       setTimeout(() => {
           resolve(val);
       }, t);
   });
}


function run() {
    return delay(100, "hello").then(data => {
        console.log(data);
        return delay(200, "goodbye").then(data => {
           console.log(data);
        });
    }).then(() => {
        console.log("all done");
    });
}

run();

而且,这里适合使用async/await

// function returning a promise declared to be async
function delay(t, val) {
   return new Promise(resolve => {
       setTimeout(() => {
           resolve(val);
       }, t);
   });
}

async function run() {
    console.log(await delay(100, "hello"));
    console.log(await delay(200, "goodbye"));
    console.log("all done");
}

run();

这两个例子都产生相同的输出和相同的输出时序,所以希望你能看到从promises到async / await的映射。

答案 1 :(得分:1)

function clientRest(args) {
   return new Promise(resolve => {
      client.post("url", args, (data,response)=> {
        resolve(data)
      })
   })
}
let data_image = await clientRest(args)

答案 2 :(得分:0)

等待要求其参数返回一个承诺。你得到这个错误的原因是client.get(“http://localhost/tmp.txt”);没有回复承诺。

所以,有两种方法可以解决这个问题。

  1. 明确返回承诺
  2. 使用其他返回promises的库。示例:https://www.npmjs.com/package/node-rest-client-promise