在 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 错误?