这些声明类型有什么区别?

时间:2016-12-20 17:57:53

标签: node.js express websocket

我在NodeJS中有以下代码片段:express 1)

const app = express();
app.use('/index', function(req, res){
    res.sendFile(INDEX);
})
app.listen(portno);

2)

const app = express()
  .use('/index', (req, res) => res.sendFile(INDEX) )
  .listen(portno);

这两者有什么区别?
为什么在第二次声明后我不能使用app.use命令?

另外,为什么以下代码仅适用于第二个代码:

const Socket = require('ws').Server;
const server = new Socket({server: app});
server.on('connection', function(socket) {
        console.log('New socket opened');
});

1 个答案:

答案 0 :(得分:2)

在第二种情况下,app变量最终会返回.listen()返回的Server对象,而不是app对象。因此,当您稍后尝试使用分配给app.use()的错误内容执行app时,它无法正常工作。

请记住,当您链接这样的方法时:

var x = a().b().c();

x最终分配了链中最后一项的返回值。从技术上讲,这里发生的是a()执行,并且在返回值上,它查找要执行的.b()属性,然后在返回值上查找.c()方法,然后将其返回值分配给x

所以,在你的情况下:

const app = express().use(...).listen(...);

app变量将包含来自.listen()的返回值,该值是Server对象,而不是app对象。并且,Server对象没有您尝试使用它的.use()方法。

您可以改为执行以下任一操作:

const app = express().use(...)
app.listen(...);

或者:

const app = express();
app.use(...).listen(...);

但是,如果您确实要保留appserver变量,那么大多数人都会这样做:

 const app = express();

 // define various routes and middleware
 app.use(...);
 app.use(...);
 app.use(...);

 // start the server
 const server = app.listen(...);