Firebase Cloud Functions + Express 示例上的“无法获取”错误

Posted

技术标签:

【中文标题】Firebase Cloud Functions + Express 示例上的“无法获取”错误【英文标题】:"Cannot GET" Error on Firebase Cloud Functions + Express sample 【发布时间】: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时它会显示我的时间戳。 有人知道为什么会这样吗?

【问题讨论】:

【参考方案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/ 中提供。

【讨论】:

这为我节省了很多时间,非常感谢您写下这个答案

以上是关于Firebase Cloud Functions + Express 示例上的“无法获取”错误的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中为 Firebase 使用 Cloud Functions

Cloud Functions for Firebase 超时

Firebase Cloud Functions https.onCall 完成状态码:204

Cloud Functions for Firebase onWrite 超时

Easy Firebase Cloud Functions 组织

在 Firebase Cloud Functions 中创建 PDF