【问题标题】:Deploying express server code as firebase cloud function for react app将 express 服务器代码部署为 react 应用程序的 firebase 云功能
【发布时间】: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


【解决方案1】:

试试

app.post('/app', (req, res) => { ... })

因为如果 Hosting 没有转发请求,这就是 Cloud Functions URI。

你也可以试试:

app.post('/app/video/token', (req, res) => { ... })

【讨论】:

  • 嗨@Doug我想我应该在firebase.json中使用“function”:“app”?这样做,我现在得到一个 500 服务器错误。 firebase 上的错误表明需要 accountSid。是否有在云函数中使用 .env 文件(位于函数文件夹之外)的过程?
  • 听起来您遇到了一个与第一个无关的全新问题。我建议在这种情况下发布一个新问题。
  • "since that's what the Cloud Functions URI would be if Hosting hadn't forwarded the request" - 但是云功能不负责服务器,所以甚至没有定义app
猜你喜欢
  • 2021-01-13
  • 1970-01-01
  • 2020-03-14
  • 2020-01-09
  • 2019-11-15
  • 2020-11-24
  • 2020-12-09
  • 2020-10-07
  • 1970-01-01
相关资源
最近更新 更多