How to properly check and log http status code using promises and node.js?

前端 未结 2 1096
孤城傲影
孤城傲影 2021-01-13 14:07

I am new to JavaScript and very new to node.js framework, just started using it a few days ago. My apologies if my code is nonsensical, the whole idea of promises and callba

相关标签:
2条回答
  • 2021-01-13 14:48

    Using util.promisify(), you can convert http.get() into a promise-based asynchronous method, but first there's some preparation to do since it does not follow the convention of 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
      }
    }
    

    In addition, you can use http.STATUS_CODES to get the the appropriate message for each possible statusCode rather than returning a vague Error or Success.

    0 讨论(0)
  • 2021-01-13 14:54

    You mixed up the first two lines. The new Promise wrapper that gets you the value to return needs to be on the outside, and the http.get call should be inside its executor callback. Also you don't really need that timeout:

    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}`)
                }
            })
        })
    }
    
    0 讨论(0)
提交回复
热议问题