部署DialogFlow CX webhook到Google Cloud Functions报EADDRINUSE:8080错误
问题原因
你使用的代码是面向本地运行、普通Node.js服务环境编写的,不符合Google Cloud Function的代码规范:
Google Cloud Function运行时会自动处理HTTP请求监听、端口分配,你代码里的app.listen(port, ...)主动监听8080端口,会和云函数平台本身已经占用的8080端口冲突,因此触发EADDRINUSE报错。同时你package.json中的start脚本也是普通Node服务的启动配置,云函数无需该配置。
修复方案
1. 替换index.js代码
不需要自行初始化express服务、配置bodyParser、监听端口,直接按照云函数规范导出HTTP处理函数即可:
'use strict'; exports.bmiWebhook = (req, res) => { const params = req.body.sessionInfo.parameters; var heightnumber = params["height.number"]; var weightnumber = params["weight.number"]; var heightunit = params["height.unit-height"] var weightunit = params["weight.unit-weight"] var computedBMI; if (heightunit == "cm" && weightunit == "kg") { //使用公制单位 computedBMI = ((weightnumber/heightnumber/heightnumber )) * 10000; } else if (heightunit == "in" && weightunit == "lb") { //使用英制单位 computedBMI = ((weightnumber/heightnumber/heightnumber )) * 703; } const replyBMI = { 'fulfillmentResponse': { 'messages': [ { 'text': { 'text': [ 'This is a response from webhook! BMI is ' + computedBMI ] } } ] } } res.send(replyBMI); };
2. 替换package.json配置
删除不必要的start脚本,更新Node版本到兼容版本,也不需要额外引入express和body-parser依赖,云函数运行环境已经内置了请求解析能力:
{ "name": "cx-test-functions", "version": "0.0.1", "author": "Google Inc.", "main": "index.js", "engines": { "node": "16.x" }, "dependencies": {} }
3. 调整云函数配置
部署前在云函数的「运行时、构建、连接」设置页,找到「入口点」配置项,将值修改为你导出的函数名bmiWebhook,再重新部署即可解决端口占用报错。
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

