2016-12-20 58 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(...);