关于快速服务器和nodejs http服务器的困惑

时间:2017-06-27 13:19:39

标签: node.js express

我正在学习redis,在文档中他们有以下服务器设置:

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(80);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

正如你所看到的那样,他们正在第一行创建快速服务器,这是我通常所做的,但是然后他们将快递传递给server = require('http'),我猜测它是一个http的节点模块服务器

我通常会做这样的事情:

const express = require('express')
const routes = require('./routes')

api.use('/', routes)

// Fireup up API server
api.listen(9090, () => {
  debug('API server listening on port 9090...')
})

为什么第一个示例express被传递给nodejs http模块?

修改 我理解行var server = require('http').Server(app)是这样我们以后可以使用var io = require('socket.io')(server);将服务器传递给socket.io我不明白的是: 什么是'http'模块? 它从何而来? 它与快递服务器有什么不同?

我提供的第二个例子来自api后端服务器,它使用api前缀进行调用,这就是为什么它有'/ api',我只是用它来演示我是如何设置一个服务器并显示我在此过程中没有使用require('http').Server(app);

EDIT2 基于答案和评论的另一个问题。 为什么我们需要额外的步骤将服务器传递给socket.io而不是直接传递Express服务器?

1 个答案:

答案 0 :(得分:3)

第一个是将Express应用程序挂载到新的HTTP Server实例,该实例也正在使用Socket.io监听套接字连接。这是您可以创建一个运行Socket.io的Express Server的方法之一。

以下是具有与示例代码相同的Express和HTTP模块用途的socket.io docs

HTTP module是Node Core API的一部分,因此它只是节点的一部分。您可以在节点应用程序中随时要求它。 Express使用http模块构建并包装http.Server。因此,HTTP和Express的不同之处在于Express构建在http.Server类之上,并添加了诸如中间件,视图引擎等内容。

如果你不需要socket.io那么你就可以摆脱它,就像你的第二个代码示例一样。但是,不确定该代码段中api表达实例的来源。

const express = require('express')
const routes = require('./routes')
const server = express()
const port = process.env.PORT || 1337

server.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

server.use('/api', routes)
server.listen(port, () => { console.log(`Listening on ${port}`) })