如何在socket.io服务器中调用节点api响应

3

场景: 创建一个Node API(GET),在socket.io Node服务器中调用该API,并在angular客户端中调用此socket服务器。

我所做的:创建了一个用于get请求和post请求的Node API,创建了一个socket服务器,我尝试消耗这个应用程序。

问题:1. 我尝试使用API,但无法在socket服务器中获取数据;2. 如果它可以工作,如何在Angular应用程序中通过按钮单击获取套接字数据?

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

以下是我的代码:

运行在3000端口的Node 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}!`));

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

注意:Node API服务器 --> socketio服务器(不是客户端)。
2个回答

3

我不建议采用你所拥有的那种设计。

除非有非常特定/重要的原因要求socket.io服务器必须在不同于HTTP服务器的端口上,否则我建议将您的socket.io服务器升级到HTTP服务器本身。

例如:

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

0

那好吧,但我们如何在socket.io服务器中调用并发射它呢? - Shyam Nair
这可能会有帮助:https://socket.io/docs/emit-cheatsheet/ - Govi-Boy
3
欢迎来到 Stack Overflow!欢迎提供解决方案链接,但请确保您的回答即使没有链接也是有用的:添加链接周围的上下文,以便其他用户知道它是什么以及为什么要在此处添加链接,然后引用您链接页面中最相关的部分,以防目标页面无法访问。只包含链接的答案可能会被删除 - Tschallacka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接