我正在使用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();
});
整个客户端和服务器代码大于此处显示的代码。 已经感谢您的帮助。