我有一个使用Firebase云函数的Express API已经在生产中,但我需要向它添加自定义域。我按照这些说明使用Firebase主机为云函数创建了一个自定义域,并最终得到了以下firebase.json
{
"functions": {
"predeploy": [
"npm --prefix "$RESOURCE_DIR" run lint",
"npm --prefix "$RESOURCE_DIR" run build"
],
"source": "functions"
},
"firestore": {
"rules": "firestore.rules",
"indexes": "firestore.indexes.json"
},
"emulators": {
"functions": {
"port": 5001
},
"firestore": {
"port": 8080
},
"ui": {
"enabled": false
}
},
"hosting": [{
"site": "devbp",
"target:":"devbp",
"public": "public",
"rewrites": [
{
"source": "/api/**",
"function": "api"
}
]
}]
}
索引.ts
import { functions } from './utils/exports-converter';
import App from './web-api/configs/app';
export * from './functions';
export * from './backup/schedules';
export * from './firestore-triggers/credits/credits-triggers'
export * from './schedules/transactions/aggregations-schedules';
export const api = functions.runWith({
memory: '1GB',
timeoutSeconds: 300
}).https.onRequest(App.express);
导出转换器.ts
import * as express from "express";
import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
export { express, functions, admin };
app.ts
import * as cors from "cors";
import * as bodyParser from "body-parser";
import Routes from "./routes";
import { express } from "../../utils/exports-converter";
class App {
public express: express.Application;
constructor() {
this.express = express();
this.init();
this.mountRoutes();
}
private init() {
const corsOptions = { origin: true };
this.express.use(cors(corsOptions));
this.express.use(bodyParser.raw());
this.express.use(bodyParser.json());
this.express.use(bodyParser.urlencoded({ extended: true }));
}
private mountRoutes() {
Routes.mount(this.express);
}
}
问题是api内部的端点是不可访问的,例如返回Cannot GET /api/user
的GET devbp.web.app/api/user?id=123
。此响应表明Express正在处理请求(如果没有,主机将抛出404页面(,但没有如预期的那样。
我相信我的firebase.json
中缺少了一些东西,因为如上所述,相同的api目前正在生产中。
有什么想法吗?
根据文档(此处也是(,托管语法为:
"hosting": {
...
}
而在所呈现的CCD_ 5中,您具有CCD_。试着去掉方括号。
我不确定我是否遵循逻辑,但我在代码中的任何地方都看不到任何new App
。如果我理解正确的话,如果你不创建新的App
对象,你就不会运行它的构造函数,所以express应用程序就不会创建。
第二件事我认为:(是,根据我的理解,当http get requst调用get请求时,应该调用Expressget((方法。
我在本教程中发现它不是云函数,但逻辑相似。创建新的实例应用程序并调用get方法。