В вашем втором случае переменная 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(...);