我正在学习创建一个可以提供天气的聊天机器人(使用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)
感谢您的建议,
答案 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