我不明白为什么我的连接等待本地主机,然后最终超时。我已经阅读并重读了一百万次我的代码,现在我被难住了。请帮忙。它说它正在监听端口。
另外,我已经编辑了一些代码,但正如你所看到的,我需要我的套接字,快递和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();您只是将呼叫链接在一起,而不是折旧或新的。