Firebase 功能:koa.js 服务器如何部署

Posted

技术标签:

【中文标题】Firebase 功能:koa.js 服务器如何部署【英文标题】:Firebase functions: koa.js server how to deploy 【发布时间】:2018-01-31 22:07:13 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

可以使用 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 和tutorial video 了解更多信息。

顺便说一下,这里是 another example 将 Koa 部署到 now.sh 版本 2。

【讨论】:

【参考方案2】:

您实际上可以完全跳过监听调用,并使用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());

【讨论】:

正确答案! 如果我得到请求超时,我尝试了functions.https.onRequest(app.callback())functions.https.onRequest((req, res) => app.callback(req,res)) 当我这样做时functions.https.onRequest(app.callback) 我得到Cannot read property 'middleware' of undefined【参考方案3】:

您可以使用 firebase 托管运行快速应用程序,以通过 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

【讨论】:

【参考方案4】:

对于任何寻找koaGoogle 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

【讨论】:

【参考方案5】:

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

查看Cloud Functions for Firebase main page 以查看列表。

Cloud Firestore 触发器 实时数据库触发器 Firebase 身份验证触发器 Google Analytics for Firebase 触发器 Crashlytics 触发器 云存储触发器 云发布/订阅触发器 HTTP 触发器

【讨论】:

Firebase 函数并非如此。仅当您直接使用 Google Cloud Functions 时。

以上是关于Firebase 功能:koa.js 服务器如何部署的主要内容,如果未能解决你的问题,请参考以下文章

koa 常用中间件

Koa.js + 函数计算实现serverless后台

Koa.js 服务端请求性能优化

koa入坑及其中间件原理

Firebase 推送通知如何发送到设备

基于Koa.js和React开发Web应用