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

Squ*_*chy 6 javascript callback node.js 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)
Run Code Online (Sandbox Code Playgroud)

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

   // Example Printout
   {
      success: ['https://www.google.com/', 'https://www.spotify.com/us/', 
      'https://twitter.com /' ],
      error: [''http://google.com/nothing']
   } 
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 6

你混淆了前两行。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}`)
            }
        })
    })
}
Run Code Online (Sandbox Code Playgroud)