簡體   English   中英

將快速服務器代碼部署為反應應用程序的 Firebase 雲功能

[英]Deploying express server code as firebase cloud function for react app

我有以下快速服務器代碼,我想將其作為 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"
  }
}

這是反應應用程序中的 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 文件的一部分編輯為

{ "source": "/video/token", "function": "app" },

這似乎有效。 我創建了一個測試 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)

嘗試

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

因為如果 Hosting 沒有轉發請求,這就是 Cloud Functions URI 的內容。

你也可以試試:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM