Как вызвать ответ API узла на сервере socket.io - PullRequest
3 голосов
/ 14 июля 2020

Сценарий: Создание API узла (GET), вызывающего этот API на сервере узла socket.io и вызывающего этот сервер сокета в клиенте angular.

Что у меня есть сделано: Создал API узла для получения запроса и публикации и создал сервер сокетов. Я попытался использовать приложение.

Проблемы: 1. Я попытался использовать API, но был невозможно получить данные на сервере сокетов и 2. Если это работает, также как я могу получить данные сокета при нажатии кнопки в приложении angular?

Примечание: я использую API узла на сервере 3000 и запущен сервер сокетов на 3001.

Ниже мой код

Код api узла, работающий на порте 3000:

const express = require('express')
const bodyParser = require('body-parser');
const cors = require('cors');

const app = express()
const port = 3000

let books = [{
    "isbn": "9781593275846",
    "title": "Eloquent JavaScript, Second Edition",
    "author": "Marijn Haverbeke",
    "publish_date": "2014-12-14",
    "publisher": "No Starch Press",
    "numOfPages": 472,
}];

app.use(cors());

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.post('/book', (req, res) => {
    const book = req.body;

    // output the book to the console for debugging
    console.log(book);
    books.push(book);

    res.send('Book is added to the database');
});

app.get('/book', (req, res) => {
    res.json(books);
});



app.listen(port, () => console.log(`Hello world app listening on port ${port}!`));

Socket Сервер .io работает на 3001

  var app = require('express')();
    var http = require('http').createServer(app);
    var io = require('socket.io')(http);
    
    const apiUrl="http://localhost:3000/book"
    
    
    io.on('connection', function (socket) {
        socket.on('getBanners', function(data){
          request.get(apiUrl,function (error, response, body){
              console.log(body)
            socket.emit('result', {res:JSON.parse(body)})
          })
        });
      });
    
    http.listen(3001, function(){
        console.log('listening on *:3001');
    });

Примечание. Сервер API узла -> сервер socketio (не клиент)

Ответы [ 2 ]

3 голосов
/ 24 июля 2020

Я бы не рекомендовал использовать тот дизайн, который у вас есть.

Если нет очень конкретной / важной причины, чтобы сервер socket.io был на другом порту, чем HTTP-сервер, я бы рекомендовал иметь ваш сервер socket.io обновлен с самого HTTP-сервера.

например.

In bin/www:

const { initSocketIOServer } = require('../socket-server');

const port = normalizePort(process.env.PORT || '3001');
app.set('port', port);

/**
 * Create HTTP server.
 */

const server = http.createServer(app);
initSocketIOServer(server);

In socket.server.js

module.exports.initSocketServer = (server) => {
  io = require('socket.io')(server);

  io.on('connection', (socket) => {
    console.log('client connected');

    socket.on('getBanners', (event) => {
      // handle getBanners event here
    });
  });
};

Однако, исходя из вашего примера, если вам действительно нужно сделать запрос к HTTP-серверу для получения данных, вы можете использовать библиотеку HTTP:

socket.on('getBanners', (event) => {
  http.get({
    hostname: 'localhost',
    port: 3000,
    path: '/book',
    agent: false  // Create a new agent just for this one request
  }, (res) => {
    // Do stuff with response, eg.
    const socketResponse = processBooks(book);
    socket.emit('result', socketResponse);
  });
});
0 голосов
/ 14 июля 2020

Вы можете использовать любой пакет узла для таких запросов, как запрос https://github.com/request/request здесь

...