【问题标题】:"Cannot GET" Error on Firebase Cloud Functions + Express sampleFirebase Cloud Functions + Express 示例上的“无法获取”错误
【发布时间】:2019-10-01 09:01:37
【问题描述】:

我是 firebase 新手,正在尝试从下面的视频中制作简单的 Cloud Functions + Express 示例。
https://www.youtube.com/watch?v=LOeioOKUKI8

当我尝试从 http://localhost:5000/timestamp 提供我的 index.js 时,我收到以下错误。

无法获取 /{my-project-id}/us-central1/app/timestamp

在我的终端中,我得到以下输出。

⚠ 创建了默认的“firebase-admin”实例!
i 函数:在 ~1 秒内完成“应用程序”
[托管] 将 /timestamp 重写为 http://localhost:5001/{my-project-id}/us-central1/app 用于本地函数应用

但如果我部署,它会按预期工作,并且会显示我的时间戳。

我当前的代码如下。

index.js

var admin = require("firebase-admin");
admin.initializeApp();

const functions = require('firebase-functions');
const express = require('express');

const app = express();

app.get('/timestamp', (request, response) => {
  response.send(`${Date.now()}`);
});

exports.app = functions.https.onRequest(app);

firebase.json

{
  "hosting": {
    "public": "public",
    "rewrites": [{
      "source": "/timestamp",
      "function": "app"
    }],
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}

如果我将 index.js 的一部分重写为类似,

app.get('/{my-project-id}/us-central1/app/timestamp', (request, response) => {
  response.send(`${Date.now()}`);
});

当我访问http://localhost:5000/timestamp时它会显示我的时间戳。
有人知道为什么会这样吗?

【问题讨论】:

    标签: node.js firebase express google-cloud-functions firebase-hosting


    【解决方案1】:

    在我这边,我尝试使用 Firebase 云功能开发一个 Rest API。我有同样的错误。如果我通过“Firebase deploy”推送我的代码 Firebase 服务器,它正在运行我想要的。但是,当我通过“firebase serve --only 功能,托管”命令在本地服务器上运行时,总会出现无法获取且无法运行的错误。我在这里尝试了您的代码和相同的代码。我为此找到了一个非常简单的解决方案并站在我这边。可以在本地试一下吗,

     app.get('*/timestamp', (request, response) => {
       response.send(`${Date.now()}`);
     });
    

    只需在路径前添加 *。

    更新:

    'firebase-tools' 已更新。如果您将 6.9.2 的错误版本更新到 6.10.0,则问题已得到修复。

    如需更新最新的 firebase-tools:

    npm i -g firebase-tools
    

    【讨论】:

    • 您的回答也有助于解决最新的 firebase-tools 问题。但我会将@Noncenzt 的答案作为可接受的答案,因为它不需要对我的生产代码进行任何更改。谢谢!
    • 感谢您的更新!将使用最新版本的 firebase-tools :)
    • 我也有同样的问题,把 '/my-path' 改成 '*/my-path' 给我!谢谢!
    【解决方案2】:

    我和你面临同样的问题。我通过将 firebase-tools 恢复到 6.8.0 来修复它,问题就解决了!

    npm install --global firebase-tools@6.8.0

    至于参考:https://github.com/firebase/firebase-tools/issues/1280

    【讨论】:

    • 太棒了!降级我的 firebase-tools 解决了这个问题!我会密切关注您为将来修复 firebase-tools 提供的问题。谢谢!
    【解决方案3】:

    对于一些新手,在部署之前开始使用firebase emulators:start 在本地测试功能,因为这是新的 Firebase Emulator Suite 的一部分。 firebase serve 现已弃用

    【讨论】:

      【解决方案4】:

      对于最近来到这里的人,如果您使用 firebase init 创建您的 firebase 函数,firebase emulators:start 是默认的开始方式。

      添加*/当然是前进的方式之一。

      Cannot /GET /* 的原因可能是 firebase 导出 api 的方式。

      创建api后,

      app.get('/app/testapi', (req, res) => {
        res.send({ 'status': 0});
      });
      

      导出为exports.app = functions.https.onRequest(app);时 实际的 api 变为 app/app/testapi,因为 firebase 将 api 导出到 app, (export.app)。

      您可以从这里删除多余的app

      app.get('/app/testapi', (req, res) => {
        res.send({ 'status': 0});
      });
      

      然后变成:

      app.get('/testapi', (req, res) => {
        res.send({ 'status': 0});
      });
      

      这将在app/testapi/ 中提供。

      【讨论】:

      • 这为我节省了很多时间,非常感谢您写下这个答案
      猜你喜欢
      • 2019-02-28
      • 1970-01-01
      • 2018-06-11
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 2018-09-10
      • 2019-10-02
      相关资源
      最近更新 更多