无法读取undefined的属性'action'

时间:2018-06-08 10:48:45

标签: javascript node.js dialogflow

我正在学习创建一个可以提供天气的聊天机器人(使用nodejs和dialogflow),但是我遇到了一个我无法找到解决方案的问题(我是javascript的新手)。每当我尝试使用dialogflow运行我的webhook时,我都会收到一个错误:“TypeError:无法读取未定义的属性'action'”。显然,它来自“var action = req.body.result.action;”。以下是代码的摘录:

const express = require('express');
const bodyParser = require('body-parser');
const request = require('request');
const owmToken = ; //Token

const webhook = express();
webhook.set('port',9000); webhook.use(bodyParser.json());

webhook.listen(webhook.get('port'),function() {console.log('webhook démarré en',webhook.get('port'));});    
webhook.post('/webhook',function(req,res){
    var action = req.body.result.action;
        switch(action) {
            case 'interrogation_openweathermap': {
                var ville=
                req.body.result.parameters['ville'];
                request.get(
                    'http://api.openweathermap.com/data/2.5/?q='+ville+'&lang=fr&APPID='+owmToken,
                    function(error,response,body){
                        console.log(body);
                        var json = JSON.parse(body);
                        out = construireReponseMeteoDuJour(json,"Aujourd'hui", ville);
                        res.json(out);});
                    }break ;}

    })

我正在使用NodeJs 8.11.2

完整的错误消息:

{ responseId: '4f56ae2e-3415-4fd3-bcb0-57c76d5b9927',
  queryResult:
   { queryText: 'météo nancy',
     action: 'interrogation_openweathermap',
     parameters: { Ville: 'Nancy' },
     allRequiredParamsPresent: true,
     fulfillmentText: 'Désolé, mais je ne parviens pas à obtenir la météo de Nancy, veuillez réessayer plus tard !',
     fulfillmentMessages: [ [Object] ],
     intent:
      { name: 'projects/agentfr-d7830/agent/intents/d37c07f1-b639-48b3-b48a-f9f370843e6d',
        displayName: 'Demander_Météo' },
     intentDetectionConfidence: 0.89,
     diagnosticInfo: {},
     languageCode: 'fr' },
  originalDetectIntentRequest: { payload: {} },
  session: 'projects/agentfr-d7830/agent/sessions/104fd141-0b0a-37cf-2dd0-dbacc9552968' }
    > TypeError: Cannot read property 'action' of undefined
    >     at C:\Users\Asus\Desktop\webhook\index.js:18:30
    >     at Layer.handle [as handle_request] (C:\Users\Asus\Desktop\webhook\node_modules\express\lib\router\layer.js:95:5)
    >     at next (C:\Users\Asus\Desktop\webhook\node_modules\express\lib\router\route.js:137:13)
    >     at Route.dispatch (C:\Users\Asus\Desktop\webhook\node_modules\express\lib\router\route.js:112:3)
    >     at Layer.handle [as handle_request] (C:\Users\Asus\Desktop\webhook\node_modules\express\lib\router\layer.js:95:5)
    >     at C:\Users\Asus\Desktop\webhook\node_modules\express\lib\router\index.js:281:22
    >     at Function.process_params (C:\Users\Asus\Desktop\webhook\node_modules\express\lib\router\index.js:335:12)
    >     at next (C:\Users\Asus\Desktop\webhook\node_modules\express\lib\router\index.js:275:10)
    >     at C:\Users\Asus\Desktop\webhook\node_modules\body-parser\lib\read.js:130:5
    >     at invokeCallback (C:\Users\Asus\Desktop\webhook\node_modules\raw-body\index.js:224:16)

感谢您的建议,

3 个答案:

答案 0 :(得分:0)

尝试打印' req' 。因为它没有body属性,所以req.body是未定义的。不幸的是,它没有像其他语言那样给出错误它没有属性。

答案 1 :(得分:0)

正如我在评论中提到的,你错过了为urlencoded添加身体解析器

webhook.use(bodyParser.urlencoded({ extended: false }));

答案 2 :(得分:0)

对于

  

req.body.result.parameters [ '威乐'];

您可以使用

  

req.body.queryResult.parameters.Ville