Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在socket.io服务器中调用节点api响应_Javascript_Node.js_Angular_Sockets_Socket.io - Fatal编程技术网

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

Javascript 如何在socket.io服务器中调用节点api响应,javascript,node.js,angular,sockets,socket.io,Javascript,Node.js,Angular,Sockets,Socket.io,场景:创建一个节点API(GET),在socket.io节点服务器中调用该API,并在angular client中调用该套接字服务器 我所做的:为get-request和post创建了一个节点API,并创建了一个套接字服务器,我试图使用该应用程序 问题:1。我试图使用API,但无法获取套接字服务器和2中的数据。如果它能工作,我如何在angular应用程序中获取按钮点击的套接字数据 注意:我在3000服务器上运行节点API,在3001服务器上运行套接字服务器 下面是我的代码 在3000端口上运行

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

我所做的:为get-request和post创建了一个节点API,并创建了一个套接字服务器,我试图使用该应用程序

问题:1。我试图使用API,但无法获取套接字服务器和2中的数据。如果它能工作,我如何在angular应用程序中获取按钮点击的套接字数据

注意:我在3000服务器上运行节点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');
    });

注意:节点API服务器-->socketio服务器(非客户端)

您可以使用任何节点包处理请求,如请求

我不建议你采用那种设计

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

例如

bin/www
中:

const{initSocketIOServer}=require('../socketserver');
const port=normalizePort(process.env.port | | |“3001”);
应用程序集(“端口”,端口);
/**
*创建HTTP服务器。
*/
const server=http.createServer(app);
initSocketIOServer(服务器);
socket.server.js中

module.exports.initSocketServer=(服务器)=>{
io=require('socket.io')(服务器);
io.on('连接',(套接字)=>{
log(“客户端连接”);
socket.on('GetBanner',(事件)=>{
//在此处处理GetBanner事件
});
});
};
但是,根据您的示例,如果确实需要向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);
  });
});

这没关系,但我们如何调用socket.io服务器并发出它呢?这可能会有帮助:欢迎使用堆栈溢出!欢迎链接到解决方案,但请确保您的答案在没有它的情况下是有用的:这样您的其他用户就会知道它是什么以及它为什么在那里,然后引用您链接到的页面的最相关部分,以防目标页面不可用。