首页 > 解决方案 > 使用 NodeJS 客户端来自 Webhook 的响应

问题描述

我构建了一个自定义 webhook 作为 Dialogflow 意图的实现端点。当我使用原始 JSON 响应时,它工作正常,即:{'fullfillmentText':'hi'},但似乎无法使用“actions-on-google”库。

他们网站上的代码暗示这应该可以工作:

app.intent('myintent', (conv) => {
    conv.close('See you later!');
});

但事实并非如此。Google Home 只是说我的应用没有响应。就目前而言,我的函数(使用 Fn Project)可能必须返回 JSON,如果我返回 JSON 作为响应,它并不期望它会失败。也许有人可以阐明一些?

编辑 1:我正在使用Fn Project开源函数作为服务的自定义 webhook。演示如何使用该项目是我在这里的目的,因此我不想使用内联编辑器或 Google Cloud Functions 或 firebase 或任何其他默认选项。

这是其余的代码

const fdk = require('@fnproject/fdk');
const request = require('request');

const dialogflow = require('actions-on-google');
const app = dialogflow({
  debug: true,
});

fdk.handle(function (input) {
  app.intent('myintent', (conv) => {
    conv.ask('I could not understand. Can you say that again?');
  });

  return {'fulfillmentText': 'response from webhook'}
});

标签: dialogflow-esactions-on-google

解决方案


尽管您正在创建app对象,该对象执行 Intent 处理程序等处理,并通过 向其注册处理程序,但app.intent()您没有做任何事情来“导出”它,因此app当 webhook 被触发时,将调用 的方法。调用时,它会获取请求的主体,并将格式化 JSON 以用于响应。

例如,如果您使用的是 Firebase 函数,您将app通过这些函数连接以进行处理,例如

exports.fulfillment = functions.https.onRequest(app);

但你不是。您正在使用不同的框架。

该库附带了许多开箱即用的框架,但 Fn 项目不是其中之一。理论上,您可以创建自己的Framework 对象,它会为您执行此操作(本文的“框架”部分对此进行了简要讨论,但没有详细说明如何执行此操作)。

正如您所猜测的那样,您可能最简单的方式是仅读取 JSON 请求并自己生成 JSON 响应,而无需使用 actions-on-google 库。或者您可以查看诸如multivocal之类的库,看看是否更容易利用其多框架支持。


推荐阅读