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 超时