最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Node.js如何在快速路由中使用socket.io

网站源码admin109浏览0评论

Node.js如何在快速路由中使用socket.io

Node.js如何在快速路由中使用socket.io

在我的一个node.js脚本中,我尝试在快速路由中使用socket.io。我发现了很多类似的问题,并尝试按照建议实施解决方案,但没有任何结果。可能是因为我对快递路线不了解。我点击了下面的链接,

如何在node.js的快速路由中使用socket.io

在expressjs路由中使用socket.io而不是在主server.js文件中

这是我的app.js

const express = require('express');
const app = express();
const server = require('http').createServer(app);
const io = require('socket.io').listen(server);

const PORT = 3000;
server.listen(PORT);
console.log('Server is running');
var api = require('./routes/api');

//app.use('/api', api);
app.use('/api', (req, res) => {
res.sendFile(__dirname + '/api.html');
});

app.get('/', (req, res) => {
   res.send("this is home location");
});

以及 ./routes 文件夹中的路由文件 api.js

var express = require('express');
var router = express.Router();
var fs = require("fs");
var bodyParser = require('body-parser');

const app = express();
const server = require('http').createServer(app);
const io = require('socket.io').listen(server);

console.log("inside api route");

router.get('/', function(req, res, next) {
console.log("api route called");

const connections = [];
var jsonobj = [{name:"john",score:345},{name:"paul",score:678}]

io.sockets.on('connection',(socket) => {
    connections.push(socket);
    console.log(' %s sockets is connected', connections.length); // this is not printing

    socket.on('disconnect', () => {
       connections.splice(connections.indexOf(socket), 1);
    });

    socket.emit('server message', jsonobj);

 }); 
    //res.send(jsonobj) 
});

module.exports = router;

Socket.emit 没有在我在路由使用中渲染的 html 页面上显示数据。我的 html 代码是,

//api.html

<!DOCTYPE html>
<html lang="en">

<body>
   <div class="container">
      <h1 class="jumbotron">
         Node js Socket io with  socket route example
      </h1>
      <div class="results">results</div>      
   </div>
   <script src=".3.1/jquery.min.js"></script>
   <script src=".io/2.0.4/socket.io.js"></script>
   <script>
    jQuery(document).ready(function() {
       var socket = io.connect();
       var jsondata = "";

       socket.on('server message', function(data){
         console.log('got data from server',data)
         jsondata = JSON.stringify(data);
         //console.log('jsondata',jsondata)
         $('.results').html(jsondata);
       });
    });   
 </script>
</body>
</html>

请建议我应该在 html 页面中获取路由套接字数据。 谢谢

回答如下:

好吧,让我们首先尝试理解为什么需要通过路由内的套接字发送数据。 Websocket 旨在异步发送数据,而客户端无需发出请求。如果客户端已经发出 HTTP 请求,那么您只需发送 HTTP 响应中的数据即可。

话虽如此,显然在某些用例中,您必须根据其他用户请求的操作将数据发送到某些 WebSocket 通道。如果是这种情况,有多种方法可以做到这一点。一种简洁的方法是使用“事件驱动架构”。 尝试这样的事情......在下面找到我的评论 -

const express = require('express'); const router = express.Router(); const fs = require("fs"); const bodyParser = require('body-parser'); const app = express(); const server = require('http').createServer(app); const io = require('socket.io').listen(server); // move the socket connection outside of the route controller // you must register the event listeners before anything else const connections = []; io.sockets.on('connection', (socket) => { connections.push(socket); console.log(' %s sockets is connected', connections.length); // this is not printing socket.on('disconnect', () => { connections.splice(connections.indexOf(socket), 1); }); }); // Event emitter for sending and receving custom events const EventEmitter = require('events').EventEmitter; const myEmitter = new EventEmitter(); myEmitter.on('my-event', function (jsonobj) { // do something here like broadcasting data to everyone // or you can check the connection with some logic and // only send to relevant user connections.forEach(function(socket) { socket.emit('server message', jsonobj); }); }); router.get('/some-route', function (req, res, next) { const jsonobj = [{ name: "john", score: 345 }, { name: "paul", score: 678 }] // emit your custom event with custom data myEmitter.emit('my-event', jsonobj); // send the response to avoid connection timeout res.send({ok: true}); }); module.exports = router;

发布评论

评论列表(0)

  1. 暂无评论