时间:2019-04-13 04:35:12

标签: javascript node.js request request-promise

因此,我在这里为节点做了一些可重用的代码,并且通过异步/等待来应用它。尽管我确信在使用此代码时我在这里误会了很多。但是,我发誓,我有一个项目正在使用该代码,而这个代码却有效。 我正在使用requestrequest-promise

UrlRequest: function( opts ) {
    return new Promise( (resolve, reject) => {
        request( opts, 
            function(error, request, body) {
                if (error) 
                    reject( {error: true, msg: error} );
                else
                    resolve( {body, request} );
            });
        })
        .catch(err => reject( {error: true, msg: err} ));
    }

我相当确定.catch()是错误的。但这并没有在我的第一个项目中出错。因此,我正在尝试找出执行此操作的正确方法。我浏览过的几篇文章是我提出使用此功能的地方。我也知道如果实际发生任何错误(包括这种情况),它将抛出UnhandledPromiseRejectionWarning错误。那么如何正确处理呢?

我如何使用它:

(async () => {
var result = await Promise.UrlRequest( {
    url: "...",
    method: "GET",
    headers: DefaultHeaders
    } );

// do stuff with result... 

}) ();

2 个答案:

答案 0 :(得分:1)

有了request-promise,您无需编写自己的Promise包装器

// make sure you're using the promise version
const request = require('request-promise')

var opts = {
  ...
  resolveWithFullResponse: true    //  <---  <--- to get full response, response.body contains the body
};

// if you dont plan to use UrlRequest as constructor, better name is starting with lowercase: urlRequest, some naming convention
UrlRequest: async function( opts ) {
  let res;
  try {
    res = await request(opts);
  } catch (e) {
    // handle error
    throw e
  }
  return res;
}

注意:async函数将返回值包装在Promise

答案 1 :(得分:1)

由于您已经安装了request-promise,因此不需要像正在做的那样构造Promise。只需使用it而不是request,您将得到一个承诺。与此类似的东西应该起作用:

const request = require('request-promise')

request(opts)
    .then((res) => {
        // Process res...
    })
    .catch((err) => {
        // Handle error...
    });

您可以继续将其包装在UrlRequest函数中,并与async一起使用,如下所示:

UrlRequest: async ( opts ) => {
  try {
    const response = await request(opts);
    return response;
  } catch (error) {
    // Handle error
  }
}

如果要使用then()catch(),可以执行以下操作:

UrlRequest: ( opts ) => {
  return request(opts)
            .then(response => response)
            .catch (error) {
              // Handle error
            }
}