node.js - Dialogflow V2 并将请求正文中的参数传递给 webhook
问题描述
我正在尝试将参数传递给一个意图,并且我通过它的事件名称调用该意图。
我知道参数对象必须从 Json 转换为 Struct,但由于某种原因,参数没有传递。我究竟做错了什么?
请注意,我必须将 Google 提供的“structjson.js”复制并粘贴到与我的 index.js 相同的目录中,因为我要导出到 Firebase 函数,并且我必须在 structjson.js 中的某些函数内放置一些常量所以我可以导出这些函数以在我的 index.js 文件中使用。
Dialogflow 的预期响应: “您的用户 ID 为:00000001”
Dialogflow 的实际响应: “您的用户 ID 是:${n_digit}”
请求 Dialogflow 代码
import * as functions from 'firebase-functions';
import * as dialogflow from 'dialogflow';
// // Start writing Firebase Functions
// // https://firebase.google.com/docs/functions/typescript
//
export const register = functions.https.onRequest((request, response) => {
// Instantiates a session client
const projectId = [MY_PROJECT_ID];
const sessionId = '123456789';
const languageCode = 'en-US';
let config = {
credentials: {
private_key: [MY_PRIVATE_KEY],
client_email: [MY_CLIENT_EMAIL]
}
}
const sessionClient = new dialogflow.SessionsClient(config);
// The path to identify the agent that owns the created intent.
const sessionPath = sessionClient.sessionPath(projectId, sessionId);
var structjson = require('./structjson')
// The text query request.
const req = {
session: sessionPath,
queryParams: {
"resetContexts": true,
},
queryInput: {
event: {
name: 'init',
parameters: structjson.jsonToStructProto({userID: '00000001'}),
languageCode: languageCode,
},
},
};
sessionClient
.detectIntent(req)
.then((responses) => {
const result = responses[0].queryResult;
response.send(result.fulfillmentText);
})
.catch(err => {
console.error('ERROR:', err);
});
})
结构json.js
module.exports.jsonToStructProto = function jsonToStructProto(json) {
var structjson = require('./structjson')
const fields = {};
for (const k in json) {
fields[k] = structjson.jsonValueToProto(json[k]);
}
return {fields};
}
module.exports.jsonValueToProto = function jsonValueToProto(value) {
const valueProto = {};
const JSON_SIMPLE_TYPE_TO_PROTO_KIND_MAP = {
[typeof 0]: 'numberValue',
[typeof '']: 'stringValue',
[typeof false]: 'boolValue',
};
if (value === null) {
valueProto.kind = 'nullValue';
valueProto.nullValue = 'NULL_VALUE';
} else if (value instanceof Array) {
valueProto.kind = 'listValue';
valueProto.listValue = {values: value.map(jsonValueToProto)};
} else if (typeof value === 'object') {
valueProto.kind = 'structValue';
valueProto.structValue = jsonToStructProto(value);
} else if (typeof value in JSON_SIMPLE_TYPE_TO_PROTO_KIND_MAP) {
const kind = JSON_SIMPLE_TYPE_TO_PROTO_KIND_MAP[typeof value];
valueProto.kind = kind;
valueProto[kind] = value;
} else {
console.warn('Unsupported value type ', typeof value);
}
return valueProto;
}
module.exports.structProtoToJson = function structProtoToJson(proto) {
if (!proto || !proto.fields) {
return {};
}
const json = {};
for (const k in proto.fields) {
json[k] = valueProtoToJson(proto.fields[k]);
}
return json;
}
module.exports.valueProtoToJson = function valueProtoToJson(proto) {
const JSON_SIMPLE_VALUE_KINDS = new Set([
'numberValue',
'stringValue',
'boolValue',
]);
if (!proto || !proto.kind) {
return null;
}
if (JSON_SIMPLE_VALUE_KINDS.has(proto.kind)) {
return proto[proto.kind];
} else if (proto.kind === 'nullValue') {
return null;
} else if (proto.kind === 'listValue') {
if (!proto.listValue || !proto.listValue.values) {
console.warn('Invalid JSON list value proto: ', JSON.stringify(proto));
}
return proto.listValue.values.map(valueProtoToJson);
} else if (proto.kind === 'structValue') {
return structProtoToJson(proto.structValue);
} else {
console.warn('Unsupported JSON value proto kind: ', proto.kind);
return null;
}
}
Dialogflow 网络钩子
function receiveParams (agent) {
const parameter = request.body.queryResult.parameters;
const n_digit = parameter.userID;
agent.add('Your user ID is: ${n_digit}');
}
let intentMap = new Map();
intentMap.set('init', receiveParams);
agent.handleRequest(intentMap);
});
先感谢您!
解决方案
您可以发送参数,如
{
"fulfillmentText":"This is a text response",
"fulfillmentMessages":[ ],
"source":"example.com",
"payload":{
"google":{ },
"facebook":{ },
"slack":{ }
},
"outputContexts":[
{
"name":"<Context Name>",
"lifespanCount":5,
"parameters":{
"<param name>":"<param value>"
}
}
],
"followupEventInput":{ }
}
使用NodeJS 客户端,您可以保存参数,例如
let param1 = [];
let param2 = {};
let ctx = {'name': '<context name>', 'lifespan': 5, 'parameters': {'param1':param1, 'param2': param2}};
agent.setContext(ctx);
并访问这些参数,例如
let params = agent.getContext("<context name>").parameters;
let param1 = params.param1;
let param2 = params.param2;
在这里查看我的完整答案。
推荐阅读
- mysql - 无法通过 tcp 连接 mysql 服务器 NDB 集群
- javascript - react-native 中的条件语句
- python - 为什么我不能使用 python 查询 Influxdbv2 数据?
- html - boostrap 下拉菜单在悬停时闪烁
- java - 如何以编程方式检查“自动日期和时间”中是否选择了“使用 GPS 提供的时间”?
- amazon-web-services - AWS S3 托管网站的附加 DNS 名称
- vim - 如何将双引号 (") 映射到 vimrc 中的某些内容
- laravel - Laravel 向控制器提交数据,然后将数据发送到操作 URL
- django-models - Django ORM 以最少的 SQL 查询从数据库中获取模型的嵌套树
- python - 试图从 /nix/store 中删除一个包,现在系统出现错误,如何修复?