【问题标题】:Nodejs request function still not finished but code proceeds to the next step?Nodejs请求功能仍未完成但代码继续下一步?
【发布时间】:2020-12-22 07:08:21
【问题描述】:

nodejs 有点新,我似乎无法让我的回调函数工作。现在我的函数只想检查 URL 是否存在

const request = require('request')
const URL = 'http://sampleurl.com'
var urlexists = false

async _urlExists(URL){
    request(url, function (error, response, body) {
      if (!error && response.statusCode.toString()[0] === '2'){
        urlexists = true
      } else {
        throw new Error(`url is not working: ${URL}`)
      }
    })
  }  

问题是,我的代码继续执行下一个,这意味着 结果已通过,但几秒钟后,控制台显示错误提示 url 不起作用:${URL }.

基本上我只是打电话 await this._urlExists(URL)

【问题讨论】:

    标签: node.js callback request


    【解决方案1】:

    _urlExists 函数在调用request 后立即返回,然后等待响应。 _urlExists 函数需要返回一个 Promise 以便调用者知道数据何时准备就绪。

    我查看了您正在使用的 request npm 包,如果不使用 request-promise-native 包装器包,它不支持 Promises。

    但是,您仍然可以将 request 调用包装在 Promise 中:

    async _urlExists(URL) {
        return new Promise((resolve, reject) => {
            request(url, function (error, response, body) {
                if (!error && response.statusCode.toString()[0] === '2'){
                    urlexists = true;
                    resolve(true);
                } else {
                    reject(`url is not working: ${URL}`);
                }
            });
        });
    }
    

    现在,当您调用await this._urlExists 时,该函数将暂停以等待resolvereject 响应,然后再继续。要从可能的 reject 调用中捕获错误,请将 _urlExists 调用包装在 try-catch 块中。

    还要确保您调用的函数await this._urlExists 声明为async,因为await 关键字只能在async 的函数内部使用。

    如果您在实施我的解决方案时遇到任何问题或疑问,请在评论中告诉我。

    【讨论】:

    • const request = require('request-promise')怎么样
    • 测试了示例代码并且正在运行!非常感谢!
    • @Octane 那个包使用了我没有经验的 Bluebird 承诺,而且对于你的用例来说不是必需的,所以我建议使用 request-promise-native,它使用原生 Javascript Promises。
    • @Octane 没问题!如果对您有帮助,请随时支持我的回答
    猜你喜欢
    • 2013-11-28
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 2022-12-01
    • 1970-01-01
    相关资源
    最近更新 更多