Я новичок в firebase и пытаюсь заставить простой пример Cloud Functions + Express из видео ниже работать.
https://thewikihow.com/video_LOeioOKUKI8
Когда я пытаюсь обслуживать свой index.js из http://локальный: 5000/отметка времени, я получаю следующую ошибку.
Cannot GET /{my-project-id}/us-central1/app/timestamp
В моем терминале я получаю следующий вывод.
⚠ Default "firebase-admin" instance created!
i functions: Finished "app" in ~1s
[hosting] Rewriting /timestamp to http://localhost:5001/{my-project-id}/us-central1/app for local Function 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://локальный: 5000/отметка времени.
Кто-нибудь знает, почему это происходит?





Со своей стороны, я пытался разработать Rest API с облачными функциями Firebase. У меня такая же ошибка. Если я нажму свои кодовые серверы Firebase через «Развертывание Firebase», он запустит то, что я хочу. Но когда я запускаю на своем локальном сервере команду «firebase serve --only functions, hosting», всегда будет ошибка типа Cannot GET и не запуститься. Я пробовал ваш код и то же самое здесь. Я нашел смехотворно простое решение для этого и побежал на моей стороне. Не могли бы вы попробовать на месте,
app.get('*/timestamp', (request, response) => {
response.send(`${Date.now()}`);
});
Просто добавьте * перед вашим путем.
ОБНОВИТЬ :
'firebase-tools' был обновлен. Если вы обновите свою глючную версию с 6.9.2 до 6.10.0, проблема будет устранена.
Для обновления последних инструментов firebase:
npm i -g firebase-tools
Спасибо за обновление! будет использовать последнюю версию firebase-tools :)
У меня та же проблема, измените '/my-path' на '*/my-path' для меня! Спасибо!
Я сталкиваюсь с той же проблемой, что и вы. И я исправляю это, возвращая firebase-tools к 6.8.0, и проблема решается!
npm install --global [email protected]
Что касается ссылки: https://github.com/firebase/firebase-tools/issues/1280
Здорово! Понижение моих инструментов firebase решило проблему! Я буду следить за проблемой, которую вы предоставили для будущего исправления в firebase-tools. Спасибо!
Для некоторых новичков начните использовать firebase emulators:start для локального тестирования функций перед развертыванием, так как это часть нового Firebase Emulator Suite. firebase serve устарела
Для тех, кто приходит сюда в последнее время, firebase emulators:start — это способ запуска по умолчанию, если вы используете firebase init для создания своих функций Firebase.
Добавление */, конечно же, является одним из способов продвижения вперед.
Причиной 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. Но я сделаю ответ @Noncenzt принятым ответом, поскольку он не требует никаких изменений в моем производственном коде. Спасибо!