私は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']
}
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
ごとに適切なメッセージを取得します。