2016-12-20 56 views
0

我在对的NodeJS下面的代码片段与快递:
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'); 
}); 

回答

2

在你的第二个情况下,app变量什么.listen()回报它这是Server对象,而不是应用程序对象结束。因此,当您稍后尝试执行app.use()时,分配给app的错误事件不能正常工作。

请记住,当你连锁这样的方法:

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

x最终分配链中的最后一个项目的返回值。从技术上讲,a()执行的是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(...);