socket.io不工作node.js

socket.io不工作node.js,node.js,express,socket.io,Node.js,Express,Socket.io,我无法运行node.js中的socket.io代码,在运行代码时,console.log()也没有显示。下面是代码 app.js var express = require('express'); var http = require('http'); var app = express(); app.set('port', process.env.PORT || 3000); app.post('/testStream',test.testStream); var server = http.

我无法运行node.js中的socket.io代码,在运行代码时,console.log()也没有显示。下面是代码

app.js

var express = require('express');
var http = require('http');
var app = express();
app.set('port', process.env.PORT || 3000);
app.post('/testStream',test.testStream);
var server = http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

module.exports.appServer = server;
我已经创建了一个test.js文件,在这里我访问这个导出的变量appServer

var server = require('../app.js');

exports.testStream = function(req,res){        
    var io = require('socket.io').listen(server.appServer);
    io.on('connection',function(socket){
        console.log("in socket");
        fs.readFile('E:/temp/testimg.png',function(err,buf){
            socket.emit('image',{image: true,buffer: buf});
            console.log("test image");
        });
    })       
}

当代码运行时,它将阻塞,而不显示console.logs()。我在这里做错了什么。非常感谢您的帮助。

我建议您遵循socket.io文档中建议的代码结构

另外,您应该不要在
express中间件中调用
io.listen
io.on('connection')
。这些都是你应该只做一次的事情,理想情况下它们应该在启动时发生,在app.js内部,而不是对POST请求做出反应。事实上,我不确定您的
testStream
中间件的目的是什么,它甚至不返回任何响应(例如
res.end()

如果你想在一个单独的模块中处理套接字连接,你可以,但是不要像现在这样导出你的应用程序的
服务器
,而是尝试将
io
实例作为变量传递给你的子模块。简言之,请尝试以下方法:

app.js

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var test = require('./test')(io);

app.set('port', process.env.PORT || 3000);

server.listen(app.get('port'), function() {
    console.log('Express server listening on port ' + app.get('port'));
});
module.exports = function(io) {
    io.on('connection', function(socket) {
        console.log("in socket");
        fs.readFile('E:/temp/testimg.png', function(err, buf) {
            socket.emit('image', {
                image: true,
                buffer: buf
            });
            console.log("test image");
        });
    });
};
test.js

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var test = require('./test')(io);

app.set('port', process.env.PORT || 3000);

server.listen(app.get('port'), function() {
    console.log('Express server listening on port ' + app.get('port'));
});
module.exports = function(io) {
    io.on('connection', function(socket) {
        console.log("in socket");
        fs.readFile('E:/temp/testimg.png', function(err, buf) {
            socket.emit('image', {
                image: true,
                buffer: buf
            });
            console.log("test image");
        });
    });
};

@cbass,代码中已经有这一行了。我可以更新这个问题吗?http createServer不同步,因此当您导出该模块时,该服务器未启动,请尝试使用process.nextTick()@Tim使该代码异步,谢谢。你能给我举个例子吗?这对我真的很有帮助。嘿,这里的主要问题是你从app.js导出了错误的变量,你检查了doc socket.io,你想导出http.createServer(app),你绑定了错误的var@Tim,我不是在给var服务器赋值吗?我想这应该可以工作var server=http.createServer(app.listen)(app.get('port'),function(){console.log('Express server listening on port'+app.get('port');});testStream服务的目的是向客户端(即is设备)提供图像/视频字节流。我能够通过streams(在base64中)发送字节流,但在阅读更多内容时,我知道,即通过套接字发送字节流更有效。如果您能告诉我如何更有效地将视频字节流发送到设备,这将对我有很大帮助?在本评论部分讨论这一点对其他stackoverflow用户没有多大用处。我建议你试着用谷歌搜索“节点视频流”之类的东西,看看你找到了什么。如果您遇到任何具体问题并需要帮助,您可以随时发布新问题。谢谢。事实上,前几天我发了一个问题。