Google Dialogflow webhook 中未调用云函数

Google Cloud functions is not getting called in Dialogflow webhook

我正在创建一个 Google 助手操作,我在其中使用了 firebase 云函数并将代码部署到 firebase 云函数。

我已经复制了 webhook url 并将其粘贴到 Dialogflow 控制台中,并为默认欢迎意图启用了 Webhook 调用。

当我 运行 代码时,我收到如下错误

这里是云函数代码

const { dialogflow, Suggestions } = require("actions-on-google");

const functions = require("firebase-functions");

const app = dialogflow({ debug: true });

app.intent("Default Welcome Intent", conv => {
  if (conv.user.last.seen) {
    conv.ask(`Welcome back to Standup Sheet`);
  } else {
    const ssml = `<speak>Welcome to Standup Sheet. I will assist you to know about your teams daily task as well the over all time taken for each project.</speak>`;
    conv.ask(ssml);
  }
  conv.ask(
    new Suggestions(["Todays entries", "Yesterday entries", "Team", "Projects"])
  );
});

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

Package.json 文件

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "serve": "firebase serve --only functions",
    "shell": "firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "8"
  },
  "dependencies": {
    "actions-on-google": "^2.12.0",
    "firebase-admin": "^8.0.0",
    "firebase-functions": "^3.0.0"
  },
  "devDependencies": {
    "firebase-functions-test": "^0.1.6"
  },
  "private": true
}

来自 Firebase 云函数的日志

dialogflowFirebaseFulfillment
{
    "@type":"type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo":{
      "principalEmail":"nidhinkumar06@gmail.com"
    },
    "requestMetadata":{
        "callerIp":"2409:4072:9e:14e2:ddf4:6a38:779f:f147",
        "callerSuppliedUserAgent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36,gzip(gfe)",
        "requestAttributes":{
            "time":"2020-03-31T17:07:39.032Z",
            "auth":{}
        },
        "destinationAttributes":{}
    },
    "serviceName":"cloudfunctions.googleapis.com",
    "methodName":"google.cloud.functions.v1.CloudFunctionsService.UpdateFunction",
    "authorizationInfo":[
        {
            "resource":"projects/standup-sheet/locations/us-central1/functions/dialogflowFirebaseFulfillment",
            "permission":"cloudfunctions.functions.update",
            "granted":true,
            "resourceAttributes":{}
        }
    ],
    "resourceName":"projects/standup-sheet/locations/us-central1/functions/dialogflowFirebaseFulfillment",
    "request":{
        "updateMask":"description,entryPoint,timeout,availableMemoryMb,labels,environmentVariables,runtime,httpsTrigger,maxInstances,ingressSettings,vpcConnector,serviceAccountEmail,sourceUploadUrl",
        "@type":"type.googleapis.com/google.cloud.functions.v1.UpdateFunctionRequest",
        "function":{
            "ingressSettings":"ALLOW_ALL",
            "httpsTrigger":{},
            "serviceAccountEmail":"standup-sheet@appspot.gserviceaccount.com",
            "entryPoint":"dialogflowFirebaseFulfillment",
            "labels":{
                "deployment-tool":"console-cloud"
            },
            "sourceUploadUrl":"https://storage.googleapis.com/gcf-upload-us-central1-6a75406d-6f0b-41ee-aeb5-e264da4377bc/22bd91a1-48f6-4daa-981a-e76122332e1c.zip?GoogleAccessId=service-1064672465268@gcf-admin-robot.iam.gserviceaccount.com&Expires=1585676258&Signature=QqhcwyJXqap%2BWXvJ6Xu2hqINSaw5uNAdRadrfIFAyXEd%2F5DTkKeEmUBjlOWrcHOrbdR6lXzgLeiIERBGHud4sZ5FQSWHOJ6HBJ3OHTI0PhEuUPBhEyuGSn%2FqI3kav9QHf5tETNw2L1DXvUw0oU%2BcD6V0MSwC35D4pGCUPoqvxW38W0q7Yz0bXm26Wnlk3HwTm%2FjP2OwbQEH5Ae5mntn%2BdQHH4n2RFjXyg2JIIDVBe1f1rOzSh0vDL4Eg6Fc9n7HMfOSfJ04RoqnAj1gUUZo38uQSVfIfjVjSqEjbR%2BGvF8E2lw5CUX%2FS8BKeqq4hvSpTUmvdmGJe0qGt8ohBq524Lw%3D%3D",
            "timeout":"60s",
            "availableMemoryMb":256,
            "name":"projects/standup-sheet/locations/us-central1/functions/dialogflowFirebaseFulfillment",
            "runtime":"nodejs8"
        }
    },
    "resourceLocation":{
        "currentLocations":["us-central1"]
    }
}

现在代码正在运行,现在已完成以下步骤以使其运行。如果有人遇到此类问题,请检查以下步骤。

根本原因#1

在 Dialogflow 控制台中,我删除了导致上述错误的默认欢迎意图中的所有默认响应。所以我添加了一个默认响应并测试了工作正常的操作。但是没有显示云函数的响应。

根本原因#2

尝试使用 Dialogflow 中的内联编辑器并检查是否正在调用该函数。尝试启用内联编辑器,但它没有启用说明 Google 需要配置云,请刷新页面。查看 GCP 控制台并比较我创建的其他操作,每个操作都有存储,但这个操作没有,所以我在启用存储内联编辑器后在 Firebase 中创建了存储(在 Dialogflow 中提出查询以确认是否是因为内联编辑器没有打开的存储)。

解决方案 1

打开内联编辑器后,粘贴上面的代码和 package.json 文件并部署代码并测试它按预期工作

解决方案 2

尝试从我的机​​器部署相同的代码并启用 Webhook 而不是内联编辑器并测试操作按预期工作

解决方案 3

将导出 dialogflowFirebaseFulfillment 名称更改为 fulfillment 并部署代码并测试它不起作用所以比较两个函数并找到fulfillment 函数没有像下图那样的权限

如果您注意到上图中有一个名为 allUsers 的角色,而在 fulfillment 函数中它没有 allUsers角色

如果您查看功能仪表板 (dialogflowFirebasefulfillment),您会注意到其中的区别

履行(仪表板)

要为其启用权限,请单击信息面板并单击 添加成员 并添加 allUsers,如下所示

完成后,通过单击 Cloud FunctionsCloud Functions Invoker 为 allUsers 添加角色,然后单击保存。

现在您可以看到更新后的仪表板,如下所示

现在,如果您测试操作,它将调用云函数。