Проблемы с подключением к socket.io с использованием функций firebase и express - PullRequest
2 голосов
/ 16 января 2020

Я пытаюсь использовать соединение socket.io с хостингом / функциями firebase, но сталкиваюсь с несколькими проблемами. Это началось как проблема с CORS (которая, я уверен, все еще остается проблемой), но теперь я просто совершенно заблудился в том, что не так, ниже моя база данных. 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 и различным другим сайтам, у которых были похожие проблемы, но, похоже, ничего не получалось. Я уверен, что я делаю это неправильно, но я теряюсь из-за того, что мне не хватает для выполнения sh этого. Пожалуйста, помогите!

1 Ответ

2 голосов
/ 16 января 2020

Облачные функции предназначены для относительно краткосрочных операций с четким завершением. Вы не можете использовать облачные функции, чтобы сохранить соединение с клиентом открытым.

Причина в том, что облачные функции закрывают ресурсы вашего контейнера к тому времени, когда он думает, что вы сделали. В случае с функцией 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 или одно из многих других предложений, где вы можете управлять своими собственными процессами.

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...