将参数发送到dialogflow sdk v2上的webhook

我试图发送一些参数到dialogflow(api.ai),如用户名,电子邮件等,但我无法弄清楚。 问题是我无法使用Dialogflow v2 Nodejs SDK获取/设置任何特定数据(例如用户名,电子邮件等)。 我试图使用queryParams.payload (v1: originalRequest ),但它不起作用。 此外,我试图用数据触发自定义事件 ,但我无法获得响应的任何事件数据。 有人知道如何发送一些特定的会话对话dialogFlow数据?

有效负载的例子

const projectId = 'test-bot-test-1111'; const sessionId = user.uuid; const languageCode = 'en-GB'; const sessionClient = new dialogFlow.SessionsClient(); const sessionPath = sessionClient.sessionPath(projectId, sessionId); const request = { session: sessionPath, queryInput: { text: { text: query, languageCode } }, queryParams: { payload: { data: { username: 'bob', email: 'bob@test.com' } } } }; let resultReq; console.log('request :: ', request, '\n\n'); try { resultReq = await sessionClient.detectIntent(request); } catch (err) { // eslint-disable-next-line no-console return console.error('ERROR:', err); } 

事件的例子

  const projectId = 'test-bot-test-1111'; const sessionId = user.uuid; const languageCode = 'en-GB'; const sessionClient = new dialogFlow.SessionsClient(); const sessionPath = sessionClient.sessionPath(projectId, sessionId); const request = { session: sessionPath, queryInput: { event: { name: 'custom_event', languageCode, parameters: { name: 'sam', user_name: 'sam', a: 'saaaa' } } }, queryParams: { payload: { data: user } } }; let resultReq; console.log('request :: ', request, '\n\n'); try { resultReq = await sessionClient.detectIntent(request); } catch (err) { // eslint-disable-next-line no-console return console.error('ERROR:', err); } 

Dialogflow的v2 API使用gRPC,并有一些怪癖,其中之一就是你遇到的。 如果你看看Node.js库的样本,你可以看看如何解决这个问题。 您需要实现jsonToStructProto方法来将JavaScript对象转换为原始结构,或者仅复制样本中的structjson.js文件 。 以下是使用structjson.js文件的完整工作示例:

 // Imports the Dialogflow library const dialogflow = require('dialogflow'); // Import the JSON to gRPC struct converter const structjson = require('./structjson.js'); // Instantiates a sessison client const sessionClient = new dialogflow.SessionsClient(); // The path to identify the agent that owns the created intent. const sessionPath = sessionClient.sessionPath(projectId, sessionId); // The text query request. const request = { session: sessionPath, queryInput: { event: { name: eventName, parameters: structjson.jsonToStructProto({foo: 'bar'}), languageCode: languageCode, }, }, }; sessionClient .detectIntent(request) .then(responses => { console.log('Detected intent'); logQueryResult(sessionClient, responses[0].queryResult); }) .catch(err => { console.error('ERROR:', err); });