努力从AWS Lambda JSON获取数据

时间:2019-06-14 18:59:00

标签: json amazon-web-services aws-lambda

我正在研究一个lambda项目,并从函数内部的API中获取数据,如下所示:

{ "Title": "300", "Year": "2006", "Rated": "R", "Released": "09 Mar 2007", "Runtime": "117 min", "Genre": "Action, Fantasy, War", "Director": "Zack Snyder", "Writer": "Zack Snyder (screenplay), Kurt Johnstad (screenplay), Michael B. Gordon (screenplay), Frank Miller (graphic novel), Lynn Varley (graphic novel)", "Actors": "Gerard Butler, Lena Headey, Dominic West, David Wenham", "Plot": "King Leonidas of Sparta and a force of 300 men fight the Persians at Thermopylae in 480 B.C.", "Language": "English", "Country": "USA, Canada, Bulgaria", "Awards": "17 wins & 45 nominations.", "Poster": "https://m.media-amazon.com/images/M/MV5BMjc4OTc0ODgwNV5BMl5BanBnXkFtZTcwNjM1ODE0MQ@@._V1_SX300.jpg", "Ratings": [ { "Source": "Internet Movie Database", "Value": "7.7/10" }, { "Source": "Rotten Tomatoes", "Value": "60%" }, { "Source": "Metacritic", "Value": "52/100" } ], "Metascore": "52", "imdbRating": "7.7", "imdbVotes": "691,774", "imdbID": "tt0416449", "Type": "movie", "DVD": "31 Jul 2007", "BoxOffice": "$210,500,000", "Production": "Warner Bros. Pictures", "Website": "http://300themovie.warnerbros.com/", "Response": "True" }

我已经尝试过点符号,对所有索引建立索引,但是不管我尝试什么,控制台日志都只是带有

2019-06-14T18:33:46.394Z ecc5d247-6475-464e-8dd7-bec310d98c4a INFO undefined 

在使用lambda和lex之前,还有其他人遇到过同样的问题吗?

谢谢

const https = require('https')
let url = "http://www.omdbapi.com/?t=300&r&apikey=3ecc35a"
let reply;
const http = require('http')
 let test;

    http.get(url, res => {
      res.setEncoding("utf8");
      let body = "";
      res.on("data", data => {
        body += data;
      });
      res.on("end", () => {
       console.log(body);
        reply = JSON.parse(body);

      });
    });

目前,这在控制台中产生了一个非常好的JSON,但实际上无法提取任何内容。我已经尝试了reply.Year,reply [“ Year”],reply。[0]。几乎我可以考虑的任何组合。

完整代码

'use strict';
'use fetch';


// Close dialog with the customer, reporting fulfillmentState of Failed or Fulfilled ("Thanks, your pizza will arrive in 20 minutes")
function close(sessionAttributes, fulfillmentState, message) {
    return {
        sessionAttributes,
        dialogAction: {
            type: 'Close',
            fulfillmentState,
            message,
        },
    };
}

// --------------- Events -----------------------

function dispatch(intentRequest, callback) {
    console.log(`request received for userId=${intentRequest.userId}, intentName=${intentRequest.currentIntent.name}`);
    const sessionAttributes = intentRequest.sessionAttributes;
    //const film = intentRequest.currentIntent.film;
    const film = intentRequest.currentIntent.slots.film.toString();
    console.log(intentRequest.currentIntent.slots.film.toString());



const https = require('https')
let url = "http://www.omdbapi.com/?t=300&r&apikey=3ecc35a"
let reply;
const http = require('http')
 let test;

    http.get(url, res => {
      res.setEncoding("utf8");
      let body = "";
      res.on("data", data => {
        body += data;
      });
      res.on("end", () => {
       console.log(body);
        reply = JSON.parse(body);

      });
    });



    //const rating = reply.imdbRating;
    console.log(reply);


    callback(close(sessionAttributes, 'Fulfilled',
    {'contentType': 'PlainText', 'content': `The film ${film} has a rating of `}));

}

// --------------- Main handler -----------------------

// Route the incoming request based on intent.
// The JSON body of the request is provided in the event slot.
exports.handler = (event, context, callback) => {
    try {
        dispatch(event,
            (response) => {
                callback(null, response);
            });
    } catch (err) {
        callback(err);
    }
};

1 个答案:

答案 0 :(得分:0)

我尝试用该代码重现该问题,并出现以下错误

Response:
{
  "errorType": "TypeError",
  "errorMessage": "Cannot read property 'name' of undefined",
  "trace": [
    "TypeError: Cannot read property 'name' of undefined",
    "    at dispatch (/var/task/index.js:20:112)",
    "    at Runtime.exports.handler (/var/task/index.js:65:9)",
    "    at Runtime.handleOnce (/var/runtime/Runtime.js:63:25)",
    "    at process._tickCallback (internal/process/next_tick.js:68:7)"
  ]
}

对我来说index.js的第20行是:

console.log(`request received for userId=${intentRequest.userId}, intentName=${intentRequest.currentIntent.name}`);

但是,在问题event.currentIntent中使用测试事件时不存在,并且事件对象的name属性也不存在。

如果我删除了console.log语句的一部分,并将其更改为引用在我得到的测试事件中存在的Title属性,则:

console.log(`request received for Title=${intentRequest.Title}`);

INFO request received for Title=300

似乎该函数的代码很好地引用了属性,但是该函数没有收到预期的事件对象。

HTH

-詹姆斯