Node.js - 将请求的返回值保存为变量

问题描述

我正在开发一个 node.js 应用程序并使用 Request 从 API 获取数据,使用此函数

function do_request( method,path,body ){

  var options = {
      ...
  };

  request( options,function(err,response,body){

      if (err) console.log(err);

      return JSON.parse(response.body);

  });

}

我希望能够将返回值保存到一个变量 - 像这样:

var products = do_request('GET','/products','');

目前,如果我在上面的代码之后 console.log(products),我得到 undefined

根据我从谷歌搜索中发现的信息,它看起来可能与异步相关。我已经尝试根据我发现的一些示例/解决方案使用承诺和异步函数,但我是一个节点菜鸟,无法让它工作。有什么想法吗?

解决方法

尝试promisify request 库并在 do_request 函数中调用 async(因为您可以在 await 函数中 async }} 函数)


function do_request( method,path,body ){

  var options = {
      ...
  };

  return new Promise((resolve,reject)=>{
    request( options,function(err,response,body){
      if (err) reject(err);
      resolve(JSON.parse(response.body));
  });
  }) 

}


async function main_code(){
  try{
     var products = await do_request('GET','/products',''); 
     }
  catch(e){
     // exception handling
     }
  finally{
     // stuff to do anyway,cleanups etc etc.
    }
}

main_code();

,

异步版本看起来像这样:

async function do_request( method,body ){

  var options = {
      ...
  };

  await request( options,body){

      if (err) console.log(err);

      return JSON.parse(response.body);

  });

}

或者由于 Request 已被弃用,您可以/(应该?)使用类似 axios 的东西:

axios.get("request_url").then(function (response) {
    // handle success
    console.log(response);
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
,

您必须通过添加 async 关键字使您的函数成为异步函数,并且您可以使用 await 关键字调用您的函数。

然后当请求完成且没有错误时。您可以看到您的产品变量具有一些有意义的值。

如果您只是在函数调用行之后打印产品变量。它将是未定义的,因为到那时请求尚未完成。

您可以选择的是使用 .then(回调)而不是 await 关键字。因此,当您的请求返回时,您的产品变量将被填充,然后您可以打印它。像这样:

do_request('GET','').then((returning_value)=>{console.log(returning_value})