Firebase 函数:koa.js 服务器如何部署

Firebase functions: koa.js server how to deploy

我已经有一个用 MERN 堆栈编写的应用程序,带有 koa 服务器准备构建版本。我的主节点文件通过 node server.js 命令 运行 来启动整个应用程序看起来像 this.

在每个教程中,我看到我需要在编码的开头添加 functions.https.request 等(或者至少假设这样做)。 我如何才能像在 heroku 上一样在 firebase 上托管我的应用程序 - 整个服务器端?

您无法在 Cloud Functions 上部署和 运行 任意节点应用程序。您必须使用产品定义的不同类型的触发器。

查看列表Cloud Functions for Firebase main page

  • Cloud Firestore Triggers
  • Realtime Database Triggers
  • Firebase Authentication Triggers
  • Google Analytics for Firebase Triggers
  • Crashlytics Triggers
  • Cloud Storage Triggers
  • Cloud Pub/Sub Triggers
  • HTTP Triggers

您可以 运行 使用 firebase 托管的 express 应用程序通过 firebase 函数提供动态内容。但是,您目前不能使用 Koa.js。 functions.https.onRequest 要求您传递 HTTP 请求处理程序或从 express() 返回的快速应用程序。

这是来自 Firebase 的有关从函数提供动态内容的相关文章。 https://firebase.google.com/docs/hosting/functions

这是来自 Firebase 的关于使用 express 的视频教程。 https://www.youtube.com/watch?v=LOeioOKUKI8

可以使用 firebase 函数托管 Koa 应用程序,我在谷歌搜索和分析后发现了它。

这是来自 my project 的一段代码,现在使用 firebase 函数托管:

const Koa = require('koa');
const app = new Koa();

// ... routes code here ...

// This is just for running Koa and testing on the local machine
const server = app.listen(config.port, () => {
  console.log(`HITMers-server is running on port ${config.port}`);
});
module.exports = server;

// This export is for Firebase functions
exports.api = functions.https.onRequest(app.callback());

您可以查看the docs and tutorial video了解更多信息。

顺便说一下,这是 another example to deploy Koa to now.sh 版本 2。

您实际上可以完全跳过 listen 调用,并使用 app.callback()。 这似乎比监听一个从未真正被命中的随机端口更有意义。

const functions = require('firebase-functions');
const app = new Koa();
... // set up your koa app however you normally would
app.use(router.routes());
module.exports.api = functions.https.onRequest(app.callback());

任何正在寻找 koa Google Cloud Functions 的人,这是我在 typescript

中的工作版本
import Koa from 'koa';
import Router from 'koa-router';
import type { HttpFunction } from '@google-cloud/functions-framework/build/src/functions';

const app = new Koa();

const port = process.env.PORT || 3001;

const router = new Router();

router.get('/', async (ctx) => {
  ctx.body = 'Hello World!';
});

app.use(router.routes());

// For development on local
if (!isCloudFunctions()) {
  app.listen(port, () => {
    console.log(`Server running on port ${port}`);
  });
}

export const helloWorldApi: HttpFunction = app.callback();

function isCloudFunctions(){
   return !!process.env.FUNCTION_SIGNATURE_TYPE;
}

部署:

gcloud functions deploy test-koa-function --entry-point=helloWorldApi --runtime nodejs16 --trigger-http --allow-unauthenticated