Node.js服务器使用socket.io和express对多个客户端多次响应

我正在使用JavaScript,JQuery,express,socket.io和MySQL开发Web应用程序。我想拥有多个客户端和一台服务器来处理所有请求。大多数通信都是实时的,并且数据是从第三方或MySQL数据库中检索的。我面临以下问题:

  • 服务器应用程序不响应单个客户端(因为我使用的是io.emit),并且我不了解如何通过使用另一个socket.io API来解决该问题。我尝试了一些在StackOverflow上发布的涉及类似问题的建议,并阅读了Socket.io网站上的文档部分。
  • 如果我有两个客户端正在运行,并且一个客户端正在执行POST请求,则无论是Express还是Socket.io,服务器都会被调用两次(我尚未发现其背后的体系结构);换句话说,app.post路由(以下为app.post("/getquote"…)执行了两次;如果我添加了第三个客户端(浏览器中的另一个TAB),则app.post路由将执行3次。

服务器端的控制台日志显示:

Dirname app.use:  /Users/Raymond/Documents/WebApplications/NodeJS

Enabling Server error-handling

thisServer V0.16 is listening on port 3000

User 1  connected at Tue Nov 26 2019 15:36:51; socketid's:  0GPLkIG9ZvGxMJxBAAAA 0GPLkIG9ZvGxMJxBAAAA

User 2  connected at Tue Nov 26 2019 15:36:55; socketid's:  1Vrta1KnitnSMwXXAAAB 1Vrta1KnitnSMwXXAAAB

User 3  connected at Tue Nov 26 2019 15:36:56; socketid's:  aUxqFblAknezawBpAAAC aUxqFblAknezawBpAAAC

Getquote body:  BG

Getquote body:  BG

Getquote body:  ENSG

Getquote body:  BG

Getquote body:  ENSG

Getquote body:  ENSG

以下是使用JQuery的CLIENT代码的相关部分:

function getQuote(ticker){

  $.post('http://localhost:3000/getquote',ticker);

}

这是服务器端相关的代码:

var express     = require("express");                         // express cares about routing between server and client
var session     = require("express-session");                 // NOT USED: enabling multiple sessions
var bodyParser  = require("body-parser");
var app         = express()                                   // define methods/dependencies needed by this server
  .use(express.static(__dirname + "/views"))                  // 1st param:root directory; It serves static files like images,CSS,etc.
  .use(bodyParser.json())
  .use(bodyParser.urlencoded({extended:false}));
var mysql = require('mysql');
//
var connCounter = 0;
var server = require("http").Server(app);                     // HTTP offers following request methods: get,post.....
var io = require("socket.io")(server);
var si = require('stock-info');
//
// app.use: mount specific middleware function(s) at the specific path; executes when path matches
//
app.use(express.static(__dirname));                           // built-in middleware function in Express. It serves static files.
console.log("Dirname app.use: ",__dirname);                   // _dirname = local WebApplications directory for all local files
var socketsArr = {};
//
io.on("connection",(socket) =>{
  let myDate = Date().substring(0,24);
  connCounter++;
  console.log("User "+connCounter," connected at "+myDate+"; socketid's: ",socket.conn.id,socket.id);
  socket.on('disconnect',function(){
    console.log("User "+connCounter," disconnected at "+myDate+"; socketid: ",socket.id);
  });

  socket.emit("stmess","active Server Connection: "+connCounter," - "+myDate,"main","blue"); // message to ONE socket
});
//
server.listen(3000,() => {
  console.log("thisServer V0.16 is listening on port",server.address().port);
});
//
app.post("/getquote",(req,res,next) =>{
  console.log("Getquote body: ",req.body.ticker);
  si.getSingleStockInfo(req.body.ticker)
  .then((data) => {
    // console.log("orgData: ",data.longName);
    io.local.emit("getquote",data);                   // !!!! despite LOCAL: message send to ALL sockets/clients
  },function(err) {
      console.log("Post - UNKNOWN TICKER SYMBOL ",req.body.ticker);
      var myError = "Ticker "+req.body.ticker+" not found";
      io.local.emit("stmess",myError,"watch","red");
    });
    // console.log("getquote before next");
  next();
});

整个客户端和服务器代码大于此处显示的代码。 已经感谢您的帮助。

hash712 回答:Node.js服务器使用socket.io和express对多个客户端多次响应

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3028195.html

大家都在问