2016-12-20 2 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() выполняет и на возвращаемом значении от этого, он ищет свойство .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(...); 

Хотя, если вы на самом деле хотите сохранить оба app и server переменные, большинство людей просто сделать:

const app = express(); 

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

// start the server 
const server = app.listen(...); 
Смежные вопросы