Используйте другой сервер на странице Angular - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь создать чат для просмотра на моем веб-сайте Angular / NodeJS.

website развернут на сервере, работающем через порт 4200, backend работает на 8000, а пока шаблон chat socket.io работает на 3000.

Я подробно ознакомился с официальным руководством по чату для socket.io, поэтому у меня есть функциональная страница чата, работающая на порте 3000, но как я могу внедрить ее в компонент Angular?

Вот мой код:

server.js:

const app = require('express')();
var http = require('http').Server(app);
var http2 = require('http').Server(app);
var io = require('socket.io')(http2);

http.listen(8000, function(){
  console.log('listening on *:8000');
});
http2.listen(3000, function(){
  console.log('listening on *:3000');
});

const home = require('./home.js');
const chat = require('./chat.js');

// SOCKET.IO for testing purpose, following the tutorial
app.get('/', function(req, res){
  res.sendFile(__dirname + '/socket.html');  
});

io.on('connection', function(socket){
  ...
});

chat.component.html

<!doctype html>
<html> 
<body>

...

<div class="bottom">
  <form action="">
    <input id="m" class="messageInput" autocomplete="off"/>
    <button type="button" class="btn btn-primary btn-lg btn-block">SEND</button>
  </form>
</div>

<script src="/socket.io/socket.io.js"></script>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>
<script>
    $(function () {
      var socket = io();
      $('form').submit(function(e){
        e.preventDefault(); // prevents page reloading
        socket.emit('chat message', $('#m').val());
      $('#m').val('');
        return false;
      });
      socket.on('chat message', function(msg){
        $('#messages').append($('<li>').text(msg));
      });
    });
  </script>
</body>
</html>

Я не могу понять, как заставить модуль чата работать на моей HTML-странице без доступа к нему по маршруту (app.get('/', function(req, res){ res.sendFile(__dirname + '/socket.html') });

Что я могу сделать? Спасибо! И извините за то, что я нуб: p

1 Ответ

1 голос
/ 18 июня 2019

Socket.io отличается для клиентской стороны, он называется socket.io-client.Вам нужно получить его, используя:

npm install socket.io-client

Что ж, Мартин, тебе не нужно явно ссылаться на файл скрипта в html.Вам просто нужно импортировать переменную socket.io-client в его файл машинописного текста.

import * as io from 'socket.io-client'. //And then connect using
try {
        this._socket = io.connect(socket.io_port_you_are_using_in_server.js)
    }
    catch (e) {
        console.log('error')
    }

Теперь вы можете использовать this._socket везде, где требуется, как вы делаете в server.js.Я также создал такое приложение, как вы, используя MEAN стек 7 месяцев назад, но я предпочел использовать сервис, так как мне нужно использовать функцию чата в более чем 3 компонентах.Я даю вам пример кода, который может вам помочь.

 joinRoom(room: string, handler: string): Observable<any> {

        this._socket.emit('join', { 'room': room, 'handler': handler });
    setTimeout(()=>{
        console.log(this._socket.id)
    },10)
    let observable = new Observable((observer) => {
        this._socket.on('new user', (data) => {
            observer.next(data);
        })
    })
    return observable;
}
leaveRoom(room: string) {
    this._socket.emit('leave', room);
    this._socket.removeAllListeners()
}
 getMessages(): Observable<any> {
    let observable = new Observable((observer) => {
        this._socket.on('get message', (data) => {
            observer.next(data);
        })
    })
    return observable;
}

Просто подпишитесь на сервис и используйте привязку для отображения сообщений в шаблоне.

//create array of received msgs
received: any[] = [];
//And in ngOnInit lifecycle hook:
    this._chatService.getMessages().subscribe((data) => {
          this.received.push(data.msg )

Теперь вы можете использовать * ngFor в шаблоне для отображения сообщений.

<p *ngFor="let msg of received">msg</p>

Вы можете настроить код по вашему требованию.

Удачи, чувак!

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