【问题标题】:Node Nodejs Express Socket.io "Waiting for local host" "didnt send any data"Node Nodejs Express Socket.io“等待本地主机”“没有发送任何数据”
【发布时间】:2016-05-26 16:51:26
【问题描述】:

我不明白为什么我的连接等待本地主机,然后最终超时。我已经阅读了我的代码一百万次,现在我被难住了。请帮忙。它说它正在侦听端口..

另外,我已经编辑了一些代码,但正如您所见,我需要在同一个端口上运行我的套接字、express 和 http。提前谢谢!

    var express = require("express");
var server = require ("http").createServer(app)
var io = require("socket.io")(server);
var mongo = require("mongodb").MongoClient;
var bodyParser = require("body-parser");
var methodOverride = require('method-override');
var logger = require('morgan');
var serveStatic = require('serve-static');
var errorhandler = require('errorhandler');
var path = require('path');

var app = express();

app.set('port', process.env.PORT || 8080);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(methodOverride());
app.use(require('stylus').middleware(path.join(__dirname, 'public')));
app.use(serveStatic(path.join(__dirname, 'public')));

if (process.env.NODE_ENV === 'development') {
 app.use(errorHandler());
}

app.get("/", function(req, res) {
    res.send("index")
});

io.on("connection", function(socket) {
    console.log("a user connected..");

    mongo.connect(MONGOLAB_URI, function(err, db) {
        if(err) {
        console.log("error connecting to mongo db")
        } else {
            var collection = db.collection("chat messages")
            var stream = collection.find().sort().limit(10).stream();
            stream.on("data", function(chat) {
                console.log("emitting chat");
                socket.emit("chat", chat.content);
            });
        }
    });

    socket.on("disconnect", function() {
        console.log("user disconnected");
    });

 socket.on("chat", function (msg) {
        mongo.connect(MONGOLAB_URI, function(err, db) {
            if(err) {
        console.log("error");
            } else {
                var collection = db.collection("chat messages");
                collection.insert({content: msg}, function(err, doc) {
                    if (err) {
                        console.log("error insterting msg to database")
                    } else {
                        console.log("inserted " + msg + "to db - content")
                    }
                }); 
            }
        });
        socket.broadcast.emit("chat", msg);
    }); 
});

server.listen(app.get("port"), function (err, data) {
    if (err) {
        console.log(err)
    };
    console.log("listening on " + app.get("port"));
});

【问题讨论】:

    标签: node.js express websocket socket.io


    【解决方案1】:

    哇!我想到了!除了我需要 express 的方式外,我的代码基本上没有任何问题(尽管 async Mongo 绝对是更好的做法)。我的代码是 var express = require("express");然后我会像这样设置一个应用程序变量:var app = express()。该方法已过时,不再有效。使用 express 并设置 app 变量的正确方法是:"var app = require("express")();"这种微妙的变化使我的服务器能够正常工作。非常感谢您帮助我并向我指出更好的异步使用 mongo。我很开心!哈哈编辑:看来,问题不是过时的方法,而是我定义我的应用程序变量的顺序。 “app”在定义之前是必需的。

    【讨论】:

    • var express = require("express");var app = express();var app = require("express")(); 实际上是相同的,只是您将快速工厂方法存储到变量 express...除此之外,您还必须更改其他内容。
    • 这就是我所相信的。但这绝对是我唯一改变的事情,在查看了应用程序变量的设置方式之后,socket.io 的站点示例中需要 express 。这很奇怪..或者它可能是我的 app 变量现在被调用的位置。在我需要 express、socket.io 和我所有的中间件之前,然后设置一个 app 变量(如我原来的问题所示)。在这里,我在第一行设置了我的 app 变量,其中 express 是必需的。这是唯一的其他更改。但这对我来说意义不大。
    【解决方案2】:

    您的listen() 似乎有些不对劲,我没有看到server.listen() 中的API 使用err 和data 的参数进行回调。从外观上看,回调中没有参数。把它变成一个空的匿名函数,你确定你没有收到任何其他错误吗?

    --edit 发现您的 mongodb 集合存在问题,您使用的是同步而不是异步的集合方法,有可能集合未定义。改为这样做

    socket.on("chat", function(msg) {
        mongo.connect(MONGOLAB_URI, function(err, db) {
            if (err) {
                console.log("error");
            }
            //don't do spaces in collection names - make it async with callback
            db.collection("chatmessages", function(err, col) {
                if (err) {
                    console.log(err)
                    return;
                }
                col.insert({ content: msg}, function(err, doc) {
                    if (err) {
                        console.log("error insterting msg to database")
                        return;
                    }
                    console.log("inserted " + msg + "to db - content")
                });
            });
        });
    });
    

    --在下面编辑

    var http = require('http');
    var express = require('express');
    var mongodb = require('mongodb');
    //other stuff
    
    var app = express();
    
    //do all your app.use() here
    
    
    //add all your routes here.
    //so if routes where in a different file theortically
    //you would have requires them in at the top like var routes = require('./routes');
    //and here you would do app.use(routes);
    
    var server = http.createServer(app);
    
    //now you can require your io here
    
    var io = require('socket.io')(server) //because server is now filled with all the configuration
    
    //do you io events down below..

    基本上当你做 var app = require('express')(); 它会做同样的事情 var express = require('express'); var app = express(); 您只是将调用链接在一起,而不是折旧的或新的。

    【讨论】:

    • 不幸的是,这不起作用。我已经编辑了我的代码,以便它显示所有内容。
    • 我记得你需要使用 Socket.io 进行操作排序的方式有些有趣尝试将 server.listen 放在 socket.on('connect' 行之前,我会拉起来我有一个工作示例并将其放在答案中
    • 我现在有这样的代码: server.listen(app.get("port"), function (err, data) { if (err) { console.log(err) }; console .log("监听" + app.get("port")); }); io.on("connection", function(socket) { console.log("a user connected.."); ...但不幸的是,它仍然不起作用。嗯..
    • 或者你的意思是,我应该把我的 server.listen 放在我的 io.on 范围内,在我的 server.on("disconnect") 行之前?
    • 除了 typescript 之外的另一个建议是支持 ES6 声明而不是 ES5。 var 将变量定义“提升”到作用域的顶部,以便在实际声明和定义变量之前使用它不会引发错误。另一方面,ES6 let 不会提升,所以如果你在定义之前尝试使用变量,它会抛出错误,这是应该的。此类错误无需使用 Typescript,只需使用节点版本 4.x 或更高版本即可。
    猜你喜欢
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2019-06-29
    • 1970-01-01
    相关资源
    最近更新 更多