【问题标题】:NodeJS request not giving any response in AWS LambdaNodeJS 请求在 AWS Lambda 中没有给出任何响应
【发布时间】:2018-01-23 00:00:10
【问题描述】:

我正在使用 NodeJS 请求模块将 JSON 请求传递到 URL 并从中生成 JSON 响应。我尝试了这段代码,它生成了一个有效的响应。我正在粘贴我要求的 StackOverflow 问题的链接。

NodeJS Request returning an empty array inside a JSON response

但是,当我在 AWS Lambda 中使用相同的逻辑时,模块根本没有响应。由于根本没有反应,我无法理解问题所在。

这是使用 Alexa 作为触发器的 AWS Lambda 的处理函数。

'use strict';

var request = require('request');

var accountNumberRequest = {};
var balanceResponse = {};
const url = "https://ibluatapig.indusind.com/app/uat/balinq/AccountEnquiry?client_id=6867b781-9b21-45c5-9c55-948f7cd1a33f&client_secret=hP3yB3hM2oH4pH4hM1kV3uY8vR3qV7jY8cF6bG2sF5jX8lT1vN";
var bal = {};
exports.handler = function (event,context) {
    try{
        console.log("Try Started");
        var req = event.request;
        console.log("Request Generated");
        if(req.type === "LaunchRequest") {
            console.log("Launch Request! Calling handleLaunchRequest");
            handleLaunchRequest(context);
        } else if(req.type === "IntentRequest") {
            console.log("IntentRequest");
            let options = {};
            console.log(0);
            if(req.intent.name === "BalanceIntent") {
            console.log("Balance Intent");
                //Got the account number from Alexa request
                let accNo = req.intent.slots.AccountNumber.value;
                console.log(accNo);
                accountNumberRequest = {
                    "AERequest":{
                        "serviceType":"BE",
                        "deviceId":"Test",
                        "accountId":accNo
                        }
                };
                console.log(accountNumberRequest);
                console.log("Calling NodeJS.Request");
                request({
                    url: url,
                    method: "POST",
                    json: true,
                    header: {
                        "content-type": "application/json",
                    },
                    body: accountNumberRequest
                    }, 
                    function(error, response,body){
                        if(!error && response.statusCode === 200){
                            console.log(body.AEResponse.AcctBal[1].BalAmt);
                        } else {
                            //options.speechText = `The account <say-as interepret-as = "digits">${accNo}</say-as> does not exist`;
                            console.log("error: "+error);
                            console.log("response.statusCode"+response.statusCode);
                            console.log("response.statusText"+response.statusText);
                        }
                    }
                );
                console.log("Balance Response should be assigned by now");
                console.log(bal);


                /* if(accountNumbers.hasOwnProperty(accNo)) {
                    var balance = accountNumbers[accNo];
                    accountExists = true;
                }
                if(accountExists == true){
                    options.speechText = `The balance of account number <say-as interpret-as = "digits">${accNo}</say-as> is <say-as interpret-as = "cardinal">${balance}</say-as>`;
                } else {
                    options.speechText = `The account <say-as interepret-as = "digits">${accNo}</say-as> does not exist`;
                }*/
                context.succeed(buildResponse(options));
            }
        } else if(req.type === "SessionEndedRequest") {
            //Code here
        } else {
            throw("Unknown Intent Type");
        }

    } catch(e){
        context.fail("Exception "+e);
    }
};
function getBalance(){
    //Code to parse the JSON response and extract values from the response.
    }

function handleLaunchRequest(context){
//Code for handling launch requests    }

function buildResponse(options){
    //Code for generating response
}

【问题讨论】:

  • 运行代码时看到了什么?在调试器中单步执行代码时会看到什么?
  • 您在 AWS Lambda 日志中得到了什么?检查云观察。当您从中调用另一个 Web 服务时,它可能会因超时而终止(默认值:3 秒)

标签: json node.js amazon-web-services aws-lambda


【解决方案1】:

这就是问题所在……

// You're sending an asynchronous HTTP request here.
request();
// But you sent the response here without waiting for the above request to finish.
context.succeed();

基本上,您在request() 完成之前执行context.succeed()。因此,您基本上是在没有来自该 HTTP 请求的响应的情况下结束您的 Lambda 调用。

要修复您的代码,请将context.succeed() 放入您传递给request() 调用的回调。

附:

您应该使用 callback 而不是已弃用的 context.succeed()/context.fail() API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2012-06-04
    • 2018-08-07
    相关资源
    最近更新 更多