简体   繁体   English

努力从AWS lambda JSON获取数据

[英]Struggling to get data from AWS lambda JSON

I'm working on a lambda project and getting data from an API inside the function which looks like this 我正在研究一个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" }

I've tried dot notation, indexing all sorts but no matter what I try, the console log just comes out with 我已经尝试了点符号,索引所有种类,但无论我尝试什么,控制台日志就出来了

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

Has anyone else had the same issue before with lambda and lex? 有没有其他人在使用lambda和lex之前遇到过同样的问题?

Thanks 谢谢

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);

      });
    });

This currently produces a perfectly good JSON in the console but it's impossible to actually extract anything. 这当前在控制台中产生了一个非常好的JSON,但实际上不可能提取任何东西。 I've tried reply.Year, reply["Year"], reply.[0].Year almost any combination I can think off. 我已经尝试过回复。年,回复[“年份”],回复。[0]。几乎任何我能想到的组合。

Full Code 完整代码

'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);
    }
};

I tried to reproduce the issue with that code and got the following error 我试图用该代码重现该问题并得到以下错误

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)"
  ]
}

Line 20 of index.js for me is: index.js的第20行对我来说是:

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

However when using the test event in the question event.currentIntent doesn't exist and the name property of the event object doesn't exist either. 但是,在问题中使用test事件时, event.currentIntent不存在,并且事件对象的name属性也不存在。

If I remove part of the console.log statement and change it to reference the Title attribute which exists in the test event I get: 如果我删除部分console.log语句并将其更改为引用test属性中存在的Title属性,我会得到:

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

INFO request received for Title=300

Seems like the function's code is referencing attributes fine but the function's just not receiving it's expected event objects. 好像函数的代码引用属性很好,但函数只是没有接收它的预期事件对象。

HTH HTH

-James -詹姆士

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM