【发布时间】:2020-09-25 23:05:57
【问题描述】:
我有以下快速服务器代码,我想将其作为 Firebase 云功能运行。但是我有这个错误(找不到页面)POST https://vid-chat-app.web.app/video/token 404。我在这里做错了什么?
const config = require('./config');
const express = require('express');
const bodyParser = require('body-parser');
const pino = require('express-pino-logger')();
const { videoToken } = require('./tokens');
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(pino);
const sendTokenResponse = (token, res) => {
res.set('Content-Type', 'application/json');
res.send(
JSON.stringify({
token: token.toJwt()
})
);
};
app.post('/video/token', (req, res) => {
const identity = req.body.identity;
const room = req.body.room;
const token = videoToken(identity, room, config);
sendTokenResponse(token, res);
});
这是我尝试将代码转换为云函数
const functions = require('firebase-functions');
const config = require('./config');
const express = require('express');
const bodyParser = require('body-parser');
const pino = require('express-pino-logger')();
const { videoToken } = require('./tokens');
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(pino);
const sendTokenResponse = (token, res) => {
res.set('Content-Type', 'application/json');
res.send(
JSON.stringify({
token: token.toJwt()
})
);
};
app.post('/video/token', (req, res) => {
const identity = req.body.identity;
const room = req.body.room;
const token = videoToken(identity, room, config);
sendTokenResponse(token, res);
});
exports.app = functions.https.onRequest(app)
这里是 firebase.json 文件
{
"hosting": {
"public": "build",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "/video/token",
"destination": "app"
},
{
"source": "**",
"destination": "/index.html"
}
]
},
"functions": {
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run lint"
],
"source": "functions"
}
}
这是 react 应用中的 api 请求
const handleSubmit = useCallback(
async event => {
event.preventDefault();
const data = await fetch('/video/token', {
method: 'POST',
body: JSON.stringify({
identity: username,
room: roomName
}),
headers: {
'Content-Type': 'application/json'
}
}).then(res => res.json());
setToken(data.token);
},
[roomName, username]
);
更新
我已将一部分 firebase.json 文件编辑为
{ “来源”:“/视频/令牌”, “功能”:“应用程序” },
这似乎行得通。我创建了一个测试 GET 请求并在 Postman 上测试了地址 https://vid-chat-app.web.app/video/token。有用!但是,我现在有以下 500 错误
Error: accountSid is required
at new AccessToken (/srv/node_modules/twilio/lib/jwt/AccessToken.js:213:28)
at generateToken (/srv/tokens.js:6:10)
at videoToken (/srv/tokens.js:20:17)
at app.get (/srv/index.js:32:17)
at Layer.handle [as handle_request] (/srv/node_modules/express/lib/router/layer.js:95:5)
at next (/srv/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/srv/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/srv/node_modules/express/lib/router/layer.js:95:5)
at /srv/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/srv/node_modules/express/lib/router/index.js:335:12)
【问题讨论】:
-
根据twilio code,如果您不提供一个参数,则会引发错误。在另一边Express code 只需调用回调函数,据我所知,问题可能出在“tokens.js”中。您能否提供 tokens.js 净化后的代码?
标签: javascript firebase rest google-cloud-functions firebase-hosting