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);



5 回复

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'));
});

解析

  1. 创建方式的区别

    • 在第一种方式中,http.createServer() 接收一个 Express 应用实例作为参数,这样服务器可以直接处理 Express 路由。
    • 在第二种方式中,express.createServer() 已经被弃用,推荐使用 express() 来创建应用实例,然后通过 http.createServer() 创建服务器。
  2. 配置生效时间

    • 对于第一种方式,在调用 server.listen() 之前配置的所有设置都会生效。
    • 对于第二种方式,同样需要在 server.listen() 之前配置所有设置。
  3. Socket.io 的集成

    • 在两种方式中,socket.io 都应该在创建服务器之后立即引入,并且最好在调用 server.listen() 之前完成配置。
    • 示例代码中,socket.io 的引入和配置都是在 server.listen() 之前完成的,确保了 Socket.io 能够正确地监听服务器事件。
  4. 配置与 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 正确地监听这个服务器。希望这能解决你的疑惑。

回到顶部