Node Nodejs Express Socket.io "Waiting for local host" "didnt send any data"



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

另外,我已经编辑了一些代码,但正如你所看到的,我需要我的套接字,快递和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"));
});

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

你的 listen() 似乎有点不对劲,我在 server.listen() 中没有看到 API 接受带有 err 和数据参数的回调。从外观上看,回调中没有参数。只需将其设置为空的 Anon 函数,您确定没有收到任何其他错误吗?

-

-编辑 发现您的 MongoDB 集合存在问题,您使用的是同步而不是 A-SYNC 作为收集方法,有可能集合未定义。 改为执行此操作

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 应用程序 = require('express')();它将做同样的事情var express = require('express');var app = express();您只是将呼叫链接在一起,而不是折旧或新的。

最新更新