【问题标题】:How to call node api response in socket.io server如何在 socket.io 服务器中调用节点 api 响应
【发布时间】:2020-11-03 15:00:12
【问题描述】:

场景:创建一个节点 API (GET),在 socket.io 节点服务器中调用该 API,并在 Angular 客户端中调用该套接字服务器。

我做了什么:为获取请求和发布创建了一个节点 API,并创建了一个套接字服务器,我尝试使用该应用程序。

问题: 1. 我尝试使用 API,但无法获取套接字服务器中的数据 2. 如果可以,我如何在单击按钮时获取套接字数据角度应用?

注意:我在 3000 服务器上运行 Node API,在 3001 上运行套接字服务器。

下面是我的代码

在 3000 端口上运行的节点 api 代码:

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}!`));

在 3001 上运行的 Socket .io 服务器

  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');
    });

注意:Node API 服务器 --> socketio 服务器(不是客户端)

【问题讨论】:

    标签: javascript node.js angular sockets socket.io


    【解决方案1】:

    我不建议您采用那种设计。

    除非有非常具体/重要的原因将 socket.io 服务器与 HTTP 服务器放在不同的端口上,否则我建议您从 HTTP 服务器本身升级您的 socket.io 服务器。

    例如。

    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);
    

    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);
      });
    });
    

    【讨论】:

      【解决方案2】:

      您可以使用任何节点包来处理请求,例如请求https://github.com/request/request here

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-07
      • 2014-11-04
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      相关资源
      最近更新 更多