Nodejs中http.createServer() & express.createServer()有区别吗?
Nodejs中http.createServer() & express.createServer()有区别吗?
在socket.io的简介中看到的关于server的创建方式
var app = require(‘express’)(); var server = require(‘http’).createServer(app); ***************some setting… server.listen(port);
var app = require(‘express’).createServer(); ********************any setting??? app.listen(port);
1.这两种创建方式有什么区别吗?还是一样的效果?
2.对于第一种方式使用时,可以进行配置如app.set(port)、app.set(“view”)、app.set(“view engine”)、 app.use(express.logger(‘dev’)); app.use(express.bodyParser());…想请教, 是不是这些配置在 server.listen()之前配置就会都生效???? 3.在第二种方式创建server的时候,也使用上述配置,配置还可否生效呢?
4.在引入socket.io模块的时候,要监听server,那么我正确的引入socket.io是要在什么时候呢?是在那些配置之后呢,还是在配置之前就可以???还是socket.io只是在监听该server,和web操作的这些配置没有任何关系呢?此处求详解!!!
var app = require(‘express’)(); var server = require(‘http’).createServer(app);
var io = require(‘socket.io’).listen(server);//这个位置引入 ***************some setting… var io = require(‘socket.io’).listen(server);//和上面引入有区别吗?
server.listen(port);
var app = require(‘express’).createServer();
var io = require(‘socket.io’).listen(server);//这个位置引入 ********************any setting??? var io = require(‘socket.io’).listen(app);//和上面引入有区别吗?
app.listen(port);
Node.js 中 http.createServer()
和 express.createServer()
有区别吗?
问题背景
在 Socket.io 的文档中,可以看到两种不同的创建服务器的方式。这两种方式的主要区别在于如何初始化 Express 应用,并且它们与 Socket.io 的集成方式也有所不同。
示例代码
第一种方式
var express = require('express');
var http = require('http');
// 创建一个 Express 应用实例
var app = express();
// 创建一个 HTTP 服务器,并将 Express 应用传递给它
var server = http.createServer(app);
// 配置 Express 应用
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
// 引入并配置 Socket.io
var io = require('socket.io')(server);
io.on('connection', function(socket){
console.log('a user connected');
});
// 监听端口
server.listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
第二种方式
var express = require('express');
var http = require('http');
var socketIo = require('socket.io');
// 创建一个 Express 应用实例
var app = express.createServer();
// 配置 Express 应用
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
// 引入并配置 Socket.io
var server = http.createServer(app);
var io = socketIo.listen(server);
io.on('connection', function(socket){
console.log('a user connected');
});
// 监听端口
app.listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
解析
-
创建方式的区别:
- 在第一种方式中,
http.createServer()
接收一个 Express 应用实例作为参数,这样服务器可以直接处理 Express 路由。 - 在第二种方式中,
express.createServer()
已经被弃用,推荐使用express()
来创建应用实例,然后通过http.createServer()
创建服务器。
- 在第一种方式中,
-
配置生效时间:
- 对于第一种方式,在调用
server.listen()
之前配置的所有设置都会生效。 - 对于第二种方式,同样需要在
server.listen()
之前配置所有设置。
- 对于第一种方式,在调用
-
Socket.io 的集成:
- 在两种方式中,
socket.io
都应该在创建服务器之后立即引入,并且最好在调用server.listen()
之前完成配置。 - 示例代码中,
socket.io
的引入和配置都是在server.listen()
之前完成的,确保了 Socket.io 能够正确地监听服务器事件。
- 在两种方式中,
-
配置与 Socket.io 的关系:
- 配置(如路由、中间件等)主要用于处理 Web 请求,而 Socket.io 主要用于处理 WebSocket 连接。
- 它们虽然都是基于同一个服务器实例,但功能上是独立的。
通过以上示例和解析,我们可以清楚地理解这两种方式的主要区别以及它们与 Socket.io 集成的最佳实践。
var express = require('express'),
path = require('path'),
http = require('http'),
io = require('socket.io'),
wine = require('./routes/wines');
var app = express();
app.configure(function () {
app.set('port', process.env.PORT || 3000);
app.use(express.logger('dev'));
app.use(express.bodyParser())
app.use(express.static(path.join(__dirname, 'public')));
});
var server = http.createServer(app);
io = io.listen(server);
io.configure(function () {
io.set('authorization', function (handshakeData, callback) {
if (handshakeData.xdomain) {
callback('Cross-domain connections are not allowed');
} else {
callback(null, true);
}
});
});
server.listen(app.get('port'), function () {
console.log("Express server listening on port " + app.get('port'));
});
app.get('/wines', wine.findAll);
app.get('/wines/:id', wine.findById);
app.post('/wines', wine.addWine);
app.put('/wines/:id', wine.updateWine);
app.delete('/wines/:id', wine.deleteWine);
io.sockets.on('connection', function (socket) {
socket.on('message', function (message) {
console.log("Got message: " + message);
ip = socket.handshake.address.address;
url = message;
io.sockets.emit('pageview', { 'connections': Object.keys(io.connected).length, 'ip': '***.***.***.' + ip.substring(ip.lastIndexOf('.') + 1), 'url': url, 'xdomain': socket.handshake.xdomain, 'timestamp': new Date()});
});
socket.on('disconnect', function () {
console.log("Socket disconnected");
io.sockets.emit('pageview', { 'connections': Object.keys(io.connected).length});
});
});
这是一个例子,我没细看,你可以参考
exports.createServer = function(){
console.warn('Warning: express.createServer() is deprecated, express');
console.warn('applications no longer inherit from http.Server,');
console.warn('please use:');
console.warn('');
console.warn(' var express = require("express");');
console.warn(' var app = express();');
console.warn('');
return createApplication();
};
[地址][https://github.com/visionmedia/express/blob/master/lib/express.js]
源码里的这个函数,说明第二种写法是过时了的…应该用第一种写法
哥,咋看出来的?我没看懂?上面这段代码能说明什么?
针对你的问题,我会分步骤解答:
1. http.createServer()
和 express.createServer()
的区别
http.createServer()
是 Node.js 自带的 HTTP 模块中的方法,用于创建一个 HTTP 服务器。而 express.createServer()
是 Express 框架早期版本(v3.x 及更早)中的方法,现在已经废弃了。从 Express v4.x 开始,你应该直接使用 express()
创建应用实例。
2. 配置的生效时间
对于第一种方式,即使用 express()
创建应用实例并传给 http.createServer()
,你可以通过 app.set()
和 app.use()
在调用 server.listen()
之前进行配置。这些配置会在这次请求之前生效。
var express = require('express');
var http = require('http');
var app = express();
// 配置设置
app.set('port', process.env.PORT || 3000);
app.set('views', './views');
app.set('view engine', 'jade');
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
var server = http.createServer(app);
server.listen(app.get('port'), function () {
console.log('Express server listening on port ' + app.get('port'));
});
3. 第二种方式的配置是否生效
第二种方式是使用 express.createServer()
方法,这已经过时。但是如果你使用的是较新的 Express 版本,应该使用 express()
创建应用实例,并将其传递给 http.createServer()
。这样,所有的配置都可以正常工作。
4. 引入 socket.io 的时机
为了确保 socket.io 能够正确地与你的 HTTP 服务器通信,你应该在所有配置之后引入 socket.io 并监听 server。例如:
var express = require('express');
var http = require('http');
var io = require('socket.io');
var app = express();
var server = http.createServer(app);
// 配置设置...
io = io.listen(server);
server.listen(app.get('port'), function () {
console.log('Express server listening on port ' + app.get('port'));
});
以上代码展示了如何在 Express 应用中配置服务器,并确保 socket.io 正确地监听这个服务器。希望这能解决你的疑惑。