Node.js 运行socket.io 2.0和Express 4.0+;在同一个端口上

Node.js 运行socket.io 2.0和Express 4.0+;在同一个端口上,node.js,sockets,express,socket.io,Node.js,Sockets,Express,Socket.io,我以前在一个节点项目上安装过socket.io,而不需要express模板框架 问题 如果我添加这行代码:http.listen(3001,function(){console.log('listening on port 3001');})然后在访问localhost:3000时,我的应用程序中的套接字不起作用;在localhost:3001时,我的应用程序中的套接字起作用。如何合并这两个 错误 我正在尝试在express framework中添加socket.io,如下所示: app.js文

我以前在一个节点项目上安装过socket.io,而不需要express模板框架

问题 如果我添加这行代码:
http.listen(3001,function(){console.log('listening on port 3001');})然后在访问localhost:3000时,我的应用程序中的套接字不起作用;在localhost:3001时,我的应用程序中的套接字起作用。如何合并这两个

错误 我正在尝试在express framework中添加socket.io,如下所示:

app.js文件
const express=require('express');
var path=require('path');
var favicon=要求('serve-favicon');
var记录器=需要('morgan');
var expressValidator=require('express-validator');
var cookieParser=require('cookie-parser');
var会话=需要(“快速会话”);
var passport=需要(“passport”);
var LocalStrategy=require('passport-local')。策略;
var bodyParser=require('body-parser');
var闪存=需要(“连接闪存”);
var multer=需要('multer');
var upload=multer({dest:'./uploads'});
var mongo=require('mongodb');
var mongoose=require('mongoose');
var db=猫鼬连接;
风险值指数=要求('./路线/指数');
var-app=express();
var http=require(“http”).createServer(应用程序);
var io=require(“socket.io”)(http);
http.listen(3000,“127.0.0.1”);
var httpk=require('http');
var nsp=io.of('/channel1');
var-connectCounter=0;
var区间=未定义;
//查看引擎设置
app.set('views',path.join('views');
应用程序集(“查看引擎”、“ejs”);
app.use('/js',express.static(uu dirname+'/node_modules/bootstrap/dist/js'));//重定向引导JS
app.use('/js',express.static(uu dirname+'/node_modules/jquery/dist'));//重定向jQuery JS
app.use('/css',express.static(uu dirname+'/node_modules/bootstrap/dist/css'));//重定向引导CSS
//将您的favicon置于/公共位置后取消注释
//应用程序使用(favicon(path.join(u dirname,'public','favicon.ico'));
应用程序使用(记录器(“开发”);
use(bodyParser.json());
use(bodyParser.urlencoded({extended:false}));
//处理快速会话
应用程序使用(会话)({
秘密:'秘密',
saveUninitialized:true,
resave:是的
}));
//护照
app.use(passport.initialize());
app.use(passport.session());
//验证器
应用程序使用(expressValidator)({
errorFormatter:函数(参数、消息、值){
var namespace=param.split(“.”)
,root=namespace.shift()
,formParam=根;
while(namespace.length){
formParam+='['+namespace.shift()+']';
}
返回{
参数:formParam,
味精:味精,,
价值:价值
};
}
}));
使用(cookieParser());
app.use(express.static(path.join(uu dirname,'public'));
//对于flash消息
应用程序使用(flash());
应用程序使用(功能(请求、恢复、下一步){
res.locals.messages=require('express-messages')(req,res);
next();
});
app.get('*',函数(req,res,next){
res.locals.user=req.user | | null;
next();
});
应用程序使用(“/”,索引);
功能测试(){
get(“api url”,函数(res){
变量体=“”;
res.on('数据'),函数(数据){
body+=数据;
});
res.on('end',function(){
var parsed=JSON.parse(body);
//console.log(parsed.data.product1);
var dataArray=[];
push((parseFloat(parsed.data.product1)+Math.random()*0.1+0.01).toFixed(2));
push((parseFloat(parsed.data.product2)+Math.random()*0.1+0.01).toFixed(2));
log(数据数组);
nsp.emit('live-quote',数据数组);
});
});
}
nsp.on('连接'),功能(套接字){
socket.on('pass_data',函数(my){
console.log(我的);
});
//进行http调用
connectCounter++;
如果(间隔===未定义)间隔=设置间隔(测试,1000);
nsp.emit(‘实时用户’、connectCounter);
console.log('1个已连接用户,已连接总数:'+connectCounter);
socket.on('disconnect',function()){
连接计数器--;

如果(connectCounter看起来您使用了
express generator
来设置您的express应用程序,在这种情况下,HTTP服务器将在
bin/www
中设置,这也是设置
socket.io
服务器的地方(因为您希望在express和
socket.io
之间共享HTTP服务器)

默认的
bin/www
包含以下内容:

/**
 * Create HTTP server.
 */

var server = http.createServer(app);
这就是添加
socket.io
服务器的地方:

var server = http.createServer(app);
var io     = require('socket.io')(server);
var nsp    = io.of('/channel1');

nsp.on('connection', ...);

您是否为服务器创建侦听器?例如
server.listen(3000,()=>{//lol})
?@FelixFong我猜它正在监听端口3000。我不确定我找不到服务器的代码。听着,但当我键入npm start时。我正在访问localhost:3000,所以在幕后某处它正在监听端口3000@FelixFong如果我添加这行代码:http.listen(3001,function(){});然后在访问localhost:3000时,我的应用程序中的套接字不起作用,而在localhost:3001时,我的应用程序中的套接字起作用。如何合并这两个应用程序?@MurlidharFichadia如果您使用了
express generator
(我想您已经这样做了),您需要将
io
内容移动到
bin/www
,因为这是创建和启动HTTP服务器的地方(这不是一个理想的解决方案,但这是因为您必须绕开
express generator
构建应用程序的方式)@robertklep是的,我使用了express generator。我不介意将代码移动到bin/www,但是如果你能告诉我我应该移动代码的哪一部分,以及我应该在jsdefaults.js上修改代码的哪一部分?我已经更新了我的问题和代码。如果你能帮我解决这个问题,我会接受你的答案。它工作得非常好。但是现在我有了Functionion test和nsp.on('connection',…);www文件中的代码。我还将连接到db并与之交互。有没有办法在www文件中只包含这2或3行代码,而其余代码仍保留在app.js文件中?我现在不确定如何实现
<title><%= title %></title>
<link rel="stylesheet" href="/css/bootstrap.min.css">
<script src="/js/jquery.min.js"></script>
<script src="/js/bootstrap.min.js"></script>

<link rel='stylesheet' href='/stylesheets/style.css' />
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" >
<script src="/javascripts/script.js" ></script>

<script src="/socket.io/socket.io.js"></script>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>

  <script>
  $(function() {
    var socket = io('/channel1');
    var currentTime;

    socket.on('live', function(msg) {

        console.log("msg: "+msg);

    });

    socket.on('live-users', function(users) {
        $('#total').text(users);
    });
});

</script>
<!DOCTYPE html>
<html>
  <head><% include partials/head.ejs %></head>
  <body>
    <% include partials/header.ejs %>
    <div class="container" style="margin-top:20px;">

</div>
    <% include partials/footer.ejs %>
    <% include partials/jsdefaults.ejs %>
  </body>
</html>
/**
 * Create HTTP server.
 */

var server = http.createServer(app);
var server = http.createServer(app);
var io     = require('socket.io')(server);
var nsp    = io.of('/channel1');

nsp.on('connection', ...);