簡體   English   中英

了解Node.js承諾使用異步功能

[英]Understanding nodejs promises asynchronous functions

對於在AWS Lambda函數中使用的承諾和異步任務,我有些困惑。

我整理了一個小程序,將所學的知識嘗試對指定的網址進行爬網。 但是,當我使用無效地址運行時,程序將掛起,而不是返回無效請求。 當url有效時,它運行不會失敗,盡管我希望這不是預期的。

如果有人可以幫助我了解我的錯誤配置在以下代碼中的位置,或者如果我承諾完全錯誤的方式,將不勝感激。

const request = require('request');
const await = require('await');
const async = require('async');

exports.handler = async function(event, context, cb) {
  var domain = "https://google.com"
  var uri = "/non/existant/path"
  var url = `${domain}${uri}`

  var webpage = await getWebpage(url)

  cb(null, 'success')
}

function getWebpage(url) {
  console.log(`Connecting to '${url}'`)
  return new Promise(function (resolve, reject) {
    request(url, function(error, response, body) {
      console.log(response.statusCode)
      if (response.statusCode != 200) {
        console.log(`ERROR: ${response.statucCode}`);
        reject(`See logs for details`);
      }
      console.log('Connected! Saving contents')
      resolve(body);
    });
  });
}

您的代碼似乎有三個問題。 首先, asyncawait不是庫,它們是關鍵字(如Jonas所述)。 其次,還不清楚為什么將回調傳遞給返回promise的函數( exports.handler )。 您正在構建的API可能會令人困惑。

第三,直接回答有關無效URL為什么無效的問題:在嘗試檢查響應代碼和/或正文之前,您沒有檢查響應是否有錯誤。 試試下面的代碼。

const request = require('request')

exports.handler = async function(event, context, cb) {
  var domain = "https://google.com"
  var uri = "/non/existant/path"
  var url = `${domain}${uri}`

  var webpage = await getWebpage(url)

  cb(null, 'success') // <- It's unclear why you'd want to do this.
}

function getWebpage(url) {
  console.log(`Connecting to '${url}'`)
  return new Promise(function (resolve, reject) {
    request(url, function(error, response, body) {

      // First, check for an error.
      if (error) return reject(error)

      // Next, check the status code.
      if (response.statusCode != 200) {
        console.log(`ERROR: ${response.statusCode}`);
        return reject(new Error(response.statusCode));
      }

      // Okay, now resolve if the above checks were good.
      console.log('Connected! Saving contents')
      resolve(body)
    })
  })
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM