我使用 Ably 作为我的 Express 应用程序的提供商。 Vercel 本身建议使用 Ably 等来管理 Websocket。
问题是,一旦我部署的应用程序成功连接到 Ably,它就无法再发布或订阅频道。似乎有什么东西阻碍了任何方向的通讯。一切都在本地主机上完美运行,所以我怀疑问题与 Vercel 的配置有关。
这里是项目中用到的依赖:
"devDependencies": {
"@types/jest": "^29.5.12",
"@types/mongoose": "^5.11.97",
"@types/uuid": "^9.0.8",
"dotenv": "^16.4.5",
"eslint": "^9.0.0",
"eslint-config-prettier": "^9.1.0",
"eslint-config-standard-with-typescript": "^43.0.1",
"eslint-plugin-import": "^2.25.2",
"eslint-plugin-n": "^15.0.0 || ^16.0.0 ",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-promise": "^6.0.0",
"jest": "^29.7.0",
"nodemon": "^3.1.0",
"pre-commit": "^1.2.2",
"prettier": "^3.2.5",
"ts-jest": "^29.1.4",
"ts-loader": "^9.5.1",
"tsx": "^4.9.3",
"typescript": "^5.4.5",
"webpack": "^5.91.0",
"webpack-cli": "^5.1.4"
},
"dependencies": {
"@types/cors": "^2.8.17",
"@types/express": "^4.17.21",
"@types/node": "^20.11.22",
"@typescript-eslint/eslint-plugin": "^7.0.0",
"@typescript-eslint/parser": "^7.1.0",
"ably": "^2.0.4",
"cors": "^2.8.5",
"express": "^4.19.2",
"fp-ts": "^2.16.6",
"io-ts": "^2.2.21",
"mongodb": "^6.6.0",
"mongoose": "^8.3.3",
"random-words": "^2.0.1",
"uuid": "^9.0.1"
}
vercel.json
是:
{
"version": 2,
"builds": [
{
"src": "dist/bundle.js",
"use": "@vercel/node",
"config": { "includeFiles": ["dist/**"] }
}
],
"routes": [
{
"src": "/(.*)",
"dest": "dist/bundle.js",
"methods": ["GET", "POST", "PATCH", "DELETE", "OPTIONS"],
"headers": {
"Access-Control-Allow-Origin": "*"
}
}
]
}
知道这可能是什么原因造成的吗?
问题在于 Vercel 的后端函数(无服务器函数)有默认执行超时。这意味着大约 10 秒内,Able 连接就会超时。结果,后端订阅没有触发。在本地计算机上没有执行超时,这就是它工作正常的原因。
Vercel 的后端作为无服务器功能运行,设计为无状态且短暂的。 Ably Realtime 的连接是持久的,并随着时间的推移保持状态。
您可以探索多种选项: