web-dev-qa-db-ja.com

promiseとnode.jsを使用してhttpステータスコードを適切にチェックしてログに記録する方法は?

私はJavaScriptに不慣れで、node.jsフレームワークに非常に不慣れで、数日前にJavaScriptを使い始めました。私のコードが無意味である場合はお詫びしますが、promiseとcallbackのアイデア全体はまだ沈んでいます。私の質問は次のとおりです。ウェブサイトへの特定のリクエストが成功したかどうか、またはそれらのステータスコード応答。私は一連のWebサイトで作業していますが、これまでに行ったことは以下のとおりですが、node.jsがインストールされているローカルマシンでTypeError: Cannot read property 'then' of undefinedを取得し、その理由を理解できません。

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)

理想的には、以下の例のように結果を出力したいのですが、今のところ、コードが機能するかどうかを判断するためにconsole.logを使用しています。

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

util.promisify() を使用すると、http.get()をpromiseベースの非同期メソッドに変換できますが、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またはErrorを返すのではなく、可能なSuccessごとに適切なメッセージを取得します。

1
Patrick Roberts