gpt4 book ai didi

node.js - 使用 firebase 函数和 Express 连接到 socket.io 时出现问题

转载 作者:太空宇宙 更新时间:2023-11-03 21:50:32 25 4
gpt4 key购买 nike

我正在尝试使用带有 firebase 托管/功能的 socket.io 连接,但遇到了一些问题。它一开始是一个 CORS 问题(我确信这仍然是问题),但现在我完全不知道出了什么问题,下面是我的 firebase.json、index.js (firebase 函数文件),甚至是 Angular 客户端文件它初始化与服务器的连接。

firebase.json

{
"hosting": {
"public": "public",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"headers": [

{
"source" : "**",
"headers" : [ {
"key" : "Access-Control-Allow-Headers",
"value" : "Origin"
} ]
},
{
"source" : "**",
"headers" : [ {
"key" : "Access-Control-Allow-Origin",
"value" : "http://localhost:4200"
} ]
}
],
"rewrites": [
{
"source": "**",
"function": "app"
}
]
},
"functions": {
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run lint"
],
"source": "functions"
}
}

index.js

const functions = require('firebase-functions');
const express = require('express');
var app = express();

const http = require('http').Server(express);
const socketio = require('socket.io')(http);
const cors = require('cors');


app.use(cors({credentials: true, origin: '*:*'}));
app.get('/tester', (request, response) => {

//response.header('Access-Control-Allow-Origin', '*');
response.send('Hello!');

socketio.on('connection', socket => {
connections.push(socket);
console.log('New client connected ('+connections.length+' connections).');
//console.log(socket);
socket.emit('port', 'LIVE SHIT');
});
})

exports.app = functions.https.onRequest(app)

app.component.ts(用于连接的客户端组件)

import { Component } from '@angular/core';
import io from 'socket.io-client';

@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent {
title = 'multi-client';
port: number = 0;
socket: any;
width: number = 100;
updateVal: number = 5;
constructor()
{
this.socket = io('http://localhost:5000/tester');

this.socket.on('port', port => {
this.port = port;
})
}

updateWidth(val)
{
this.width += val;
}
}

这是我收到的错误。 enter image description here

我在 stackoverflow 和其他各种网站上查看了一些有类似问题的帖子,但似乎没有任何效果。我确信我做错了,但我对完成此任务所缺少的东西感到迷失。请帮忙!

最佳答案

云函数适用于相对短暂、结局明确的操作。您无法使用 Cloud Functions 保持与客户端的连接打开。

原因是 Cloud Functions 在认为您已完成时会关闭容器的资源。对于像您这样的 HTTP 函数,这意味着当您调用 response.send('Hello!'); 时,这些资源就会消失。

因此,一旦建立了套接字连接,就可以将响应发送到客户端,如下所示:

app.get('/tester', (request, response) => {


socketio.on('connection', socket => {
connections.push(socket);
console.log('New client connected ('+connections.length+' connections).');
//console.log(socket);
socket.emit('port', 'LIVE SHIT');

response.send('Hello!');
});
})

但在这种情况下,连接也会在调用 response.send('Hello!'); 后关闭。虽然您可以发送响应,但即使在这种情况下,连接/资源也会在 9 分钟后关闭,因为这是云函数可以运行的最长时间。

这一切都可以追溯到我最初的声明,即云函数仅适用于具有明确结束时刻的短暂操作。对于长时间运行的流程,请使用其他平台,例如 App Engine、Compute Engine 或您可以管理自己的流程的众多其他产品之一。

另请参阅:

关于node.js - 使用 firebase 函数和 Express 连接到 socket.io 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59769019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com