如何使用promises和node.js正确检查和记录http状态代码?

时间:2018-02-23 04:20:35

标签: javascript node.js callback promise es6-promise

我是JavaScript的新手,也是node.js框架的新手,几天前刚开始使用它。我很抱歉,如果我的代码是荒谬的,承诺和回调的整个想法仍然在沉沦。据说我的问题是以下我试图弄清楚某些网站请求是否成功或导致基于范围的错误他们的状态代码响应。我正在使用一系列网站,到目前为止我已经完成的工作如下,但我确实在我的本地计算机上安装了TypeError: Cannot read property 'then' of undefined并安装了node.js并且无法找出原因。



const sample = [
    'http://www.google.com/',
    'http://www.spotify.com/us/',
    'http://twitter.com/',
    'http://google.com/nothing'
]

const http = require('http')

const getStatusCodeResult = (website) => {

    http.get(website, (res) => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                let statusCode = res.statusCode
                error = statusCode >= 400 && statusCode <= 500 ? `error: ${website}`: null
                if (error) {
                    reject(error)
                    
                } else if (statusCode >= 200 && statusCode <= 300) {
                    resolve(`Success: ${website}`)
                }
            }, 0)
        })
    })
}
// LOOP PROMISES
const getAllStatusCodeResult = (websites) => {
    websites.forEach((website) => {
        getStatusCodeResult(website)
            .then((result) => {
                console.log(result)
            })
            .catch(error => {
                console.log('error', error)
            })
    })
}
getAllStatusCodeResult(sample)
&#13;
&#13;
&#13;

理想情况下,我希望将结果打印为下面的示例,但是现在我只是使用console.log来确定代码是否有效。

   // Example Printout
   {
      success: ['https://www.google.com/', 'https://www.spotify.com/us/', 
      'https://twitter.com /' ],
      error: [''http://google.com/nothing']
   } 

2 个答案:

答案 0 :(得分:2)

你混淆了前两行。获取返回值的new Promise包装器需要在外部,http.get调用应该在其执行程序回调中。你也不需要超时:

function getStatusCodeResult(website) {
    return new Promise((resolve, reject) => {
        http.get(website, (res) => {
            let statusCode = res.statusCode,
                error = statusCode >= 400 && statusCode <= 500 ? `error: ${website}`: null
            if (error) {
                reject(error)
            } else if (statusCode >= 200 && statusCode <= 300) {
                resolve(`Success: ${website}`)
            }
        })
    })
}

答案 1 :(得分:1)

使用util.promisify(),您可以将http.get()转换为基于承诺的异步方法,但首先要做一些准备工作,因为它不遵循callback(error, response) { ... }惯例:

const http = require('http')
const { promisify } = require('util')

// define a custom promisified version of `http.get()`
http.get[promisify.custom] = (options) => new Promise(resolve => {
  http.get(options, resolve)
});

// convert callback to promise
const httpGet = promisify(http.get)

async function getStatusCodeResult(website) {
  const res = await httpGet(website)
  const status = res.statusCode
  const message = `${http.STATUS_CODES[status]}: ${website}`

  if (status >= 400) {
    throw message
  } else {
    return message
  }
}

此外,您可以使用http.STATUS_CODES为每个可能的statusCode获取相应的消息,而不是返回模糊的ErrorSuccess