在我的应用程序中,客户端首先从nodejs服务器调用web服务,以从mongoDB数据库获取历史数据,以便绘制它(使用highcharts库)。然后我需要从服务器获取实时更新并将它们发送到客户端,为此,我想使用 socket.io 。
我正在使用AJAX函数来调用web服务,在完成之后,我正在尝试创建一个socket.io连接。但这不起作用。
以下是客户端端代码的一部分:
$(function(){
$.ajax({
url: 'http://localhost:3300/historicalData',
type: 'GET',
success : function(data) {
//some code here
},
complete : function(){
var socket = io('http://localhost:3300');
//after the connexion is established, i want to do some stuff here
}
});
});
以下是服务器端代码的一部分:
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get("/historicalData", function(req, res){
getData(res);
});
io.on('connection', function(socket){
console.log('A new WebSocket connection has been established');
});
app.listen("3300", function(){
console.log('Server up: http://localhost:3300');
});
我在这里做错了什么?
在我的应用程序中使用socket.io的正确方法是什么?
答案 0 :(得分:0)
您可以使用complete: () => {
const socket = io('http://localhost:3300');
socket.on('connect', socket => {
// do things
});
}
回调,如下所示......
// app.listen('3300'); // ordinary express app
http.listen('3300'); // socket server app
此外,当您需要使用套接字服务器时,您正在启动快速应用程序。通过以下更改
可以轻松解决此问题{{1}}
答案 1 :(得分:0)
创建一个全局连接,以便您可以在代码中的任何位置使用套接字。
例如,
var socket = io('http://localhost:3300',{secure:true});
$.ajax({
url: 'http://localhost:3300/historicalData',
type: 'GET',
success : function(data) {
console.log(data);
socket.emit('emit_from_here');
}
});
socket.on('server_response',(res)=>{
console.log(res);
});
此外,在您的服务器端代码中,
var socket = require( 'socket.io' );
var app = require('express')();
var http = require('http');
var server = http.createServer(app);
var port = 3300;
server.listen(port,(res)=>{
console.log('Server & Socket listening on port : '+port)
})
var io = socket.listen(server);
io.sockets.on('connection', function(socket){
socket.on('emit_from_here',()=>{
socket.emit('server_response','server response');
})
})
app.get("/historicalData",(req,res)=>{
res.send('works well');
})
希望这会有所帮助。
答案 2 :(得分:-1)
原来我必须使用:http.listen("3300")
而不是:app.listen("3300")
(我找到了解决方案,感谢这篇文章的答案https://stackoverflow.com/a/24811468/9638215)