2017-03-20 31 views
0

我正在使用本機承諾在我的節點Lambda中執行一些錯誤處理。出於某種原因,我的promise.reject從不觸發。我特意發送一個不正確的url來讓它失敗,但AWS發回502「Bad Gateway」。這大概是AWS處理內部服務器問題的方式,這很好,但我想發回拒絕原因。我究竟做錯了什麼?節點承諾和AWS Lambda錯誤處理

無極

function parseData(data) { 
    url = 'https://notarealurl'; 

    return new Promise((resolve, reject) => { 
     https.get(url, (res) => { 
      let body = ''; 
      res.on('data', (chunk) => { 
       body += chunk; 
      }) 
      .on('end',() => { 
       resolve(body); 
      }) 
      //this reject will trigger when there is an error with the request 
      .on('error', (err) => { 
       const rejectReason = { 
        statusCode: 500, 
        body: 'Internal Server Error: ' + err 
       }; 
       reject(rejectReason) 
      }); 
     }) 
    }); 
} 

我的處理程序:

function handler(event, context) { 
    parseData(event.queryStringParameters) 
    .then((result) => { 
     const parsed = JSON.parse(result); 
     //handle error message returned in response 
     if (parsed.error) { 
      const oAuthError = 'Authentication Error'; 
      let error = { 
       headers: {"Content-Type": "application/json"}, 
       body: JSON.stringify(parsed.error) 
      }; 
      if(parsed.error.type === oAuthError) { 
       error.statusCode = 401; 
       context.succeed(error); 
      } else { 
       error.statusCode = 404; 
       return context.succeed(error); 
      } 
     } else { 
      return context.succeed({ 
       statusCode: 302, 
       headers: "Success" 
       }); 
     } 
    }) 
    .catch((reason) => { 
     console.log('Promise rejected!!!!', reason) 
    }) 
} 

什麼是走出AWS錯誤,而不是我的promise.reject errorReason的?

+0

在401和404的情況下,您應該使用context.fail而不是context.success。 – notionquest

+0

@notionquest如果您返回context.fail,則API網關將解釋服務器中出現問題並引發502錯誤。由於請求成功,但響應中包含錯誤,因此根據前一個答案問題: http://stackoverflow.com/questions/42847945/aws-api-gateway-error-response-generates-502-bad-gateway/42848230#42848230 – jmcgui05

回答

0

我想通了我的問題。我得到了.on('錯誤')。更改爲以下代碼,工作得很好:

function parseData(data) { 
    url = 'https://notarealurl'; 

    return new Promise((resolve, reject) => { 
     https.get(url, (res) => { 
      let body = ''; 
      res.on('data', (chunk) => { 
       body += chunk; 
      }) 
      .on('end',() => { 
       resolve(body); 
      }) 
      //this reject will trigger when there is an error with the request 
     }) 
     .on('error', (err) => { 
       const rejectReason = { 
        statusCode: 500, 
        body: 'Internal Server Error: ' + err 
       }; 
       reject(rejectReason) 
      }); 
    }); 
}