在 Firebase 上部署使用 node.js 服务器的应用程序

Posted

技术标签:

【中文标题】在 Firebase 上部署使用 node.js 服务器的应用程序【英文标题】:Deploy an application that uses a node.js server on Firebase 【发布时间】:2020-07-10 22:23:21 【问题描述】:

我正在使用 Vue 实现一个 Web 应用程序。在应用程序中,我使用“推送器”来创建实时多用户通信。特别是,我设置了一个 node.js 服务器,侦听本地网络中特定设备的端口 5000。该应用程序在我的家庭网络中运行(我能够与连接的不同设备进行交互)。现在我想在 Firebase 上部署应用程序。

下面是与 pusher 实例的定义相关的代码,“authEndpoint”属性指定用户必须发送 http post 请求的路径才能订阅共享频道。当我在 firebase 上部署应用程序时,我应该如何管理 authEndpoint 属性和 node.js 服务器的位置,以使应用程序在互联网上运行?

 import Pusher from 'pusher-js'
  const pusher = new Pusher('*************', 
    cluster: 'eu',
    encrypted: true,
    authEndpoint: '192.168.1.237:5000/pusher/auth'
  )

这是与服务器相关的代码:

const express = require('express')
const path = require('path')
const bodyParser = require('body-parser')
const app = express()
const Pusher = require('pusher')
const crypto = require('crypto')
const cors = require('cors')

//initialize Pusher with your appId, key and secret
const pusher = new Pusher(
   appId: '****',
key: '**************',
secret: '************',
cluster: 'eu',
encrypted: true
)

// Body parser middleware
app.use(bodyParser.json())
app.use(bodyParser.urlencoded( extended: false ))
app.use(cors())
// The code below helps to fix any potential CORS issue.
app.use((req, res, next) => 
  // Website you wish to allow to connect
  res.setHeader('Access-Control-Allow-Origin', '*')
  // Request methods you wish to allow
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE')
  // Request headers you wish to allow
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type')
  // Set to true if you need the website to include cookies in the requests sent
  // to the API (e.g. in case you use sessions)
  res.setHeader('Access-Control-Allow-Credentials', true)
  // Pass to next layer of middleware
  next()
)

// Index API route for the Express app
app.get('/', (req, res) => 
  res.send('Welcome')
)

// API route used by Pusher as a way of authenticating users
app.post('/pusher/auth', (req, res) => 

  let socketId = req.body.socket_id
  let channel = req.body.channel_name
  // Generate a random string and use as presence channel user_id
  let presenceData = 
    user_id: crypto.randomBytes(16).toString('hex')
  
  let auth = pusher.authenticate(socketId, channel, presenceData)
  res.send(auth)
)

// Set port to be used by Node.js

app.set('port', (5000))

app.listen(app.get('port'), () => 
  console.log('Node app is running on port', app.get('port'))
)

【问题讨论】:

我不确定我是否理解这个问题。 ***.com/help/how-to-ask 我无法让应用程序在互联网上运行。特别是当我在 Firebase 上部署应用程序时,我不知道在哪里放置 node.js 服务器,该服务器管理对共享推送器通道的订阅(用于在用户之间共享信息)。在我的家庭网络中,node.js 服务器正在监听 192.168.1.237:5000。 @AlexMA 【参考方案1】:

在将 Pusher 库作为云函数部署到 Firebase 时,您将无法按照自己的方式使用 Pusher 库。 Cloud Functions 是短暂的无状态容器,可按需启动以响应事件和用户请求。您正在使用的 Pusher 库会建立长期连接并进行侦听,这是无法完成的,因为云函数在完成后会立即被拆除。

您可能希望查看 Pusher webhooks,它可以配置为指向 Cloud Function 的 HTTP 端点,并可能会为您提供一些您正在寻找的东西。

【讨论】:

如果我使用不同的托管服务器,例如 cloudno.de 或 nodejitsu ,我可以在不使用 Pusher webhook 的情况下解决问题吗? @Michael Bleigh 如果您发现托管服务可以保持持久进程始终运行,是的,您可以在不使用 webhook 的情况下解决此问题。

以上是关于在 Firebase 上部署使用 node.js 服务器的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Firebase CLI 部署错误:“部署到 Node.js 10 以下的运行时现在在 Firebase CLI 中被禁用。”

Firebase CLI 部署警告:Node.js 8 运行时已弃用,将于 2020-12-05 停用

为啥只有在部署到 Firebase 时才会在 Node.js 和 Angular 之间出现 CORS 错误?

部署 Firebase 推送通知功能时出错

无法使用 Firebase 管理员在 Node.js 的 Google 存储对象上设置元数据

使用 node.js 和 react.js 客户端启动一个 firebase 功能项目