express.static()
возвращает функцию промежуточного программного обеспечения при ее вызове. Вы должны передать эту конкретную возвращаемую функцию в app.use()
. Вы не просто звоните express.static()
на каждый запрос. Вы вызываете его один раз, получаете возвращаемую функцию и регистрируете ее как промежуточное ПО, а app.use()
будет вызывать эту функцию промежуточного ПО при каждом запросе.
Когда вы делаете это правильным образом, как это:
app.use('/public', express.static("./public"));
Это как делать это:
const fn = express.static("./public");
app.use('/public', fn);
или даже так:
const fn = express.static("./public");
app.use('/public', function(req, res, next) {
fn(req, res, next);
});
Надеюсь, вы видите, что этот код:
app.use('/public', function(){express.static("./public")});
не делает то же самое, что любое из правильных решений. Это вызывает express.static()
в каждом запросе и никогда не вызывает возвращенную функцию, которая выполняет фактическую работу для данного запроса.
Думайте о express.static("./public")
как о заводской функции. Он создает функцию промежуточного программного обеспечения, которую вы затем передаете app.use()
или вызываете себя с req
, res
и next
в качестве аргументов.
Почему? Похоже, сервер не ловит никаких ошибок
Выполнение app.use('/public', function(){express.static("./public")});
- это не то, что вам нужно, но оно также не создает ошибку. Все, что он делает - это создает новую функцию промежуточного программного обеспечения (которую вы игнорируете) при каждом отдельном запросе. Он также никогда не вызывает next
, чтобы позволить любым другим обработчикам запросов обрабатывать запрос, чтобы ваш сервер зависал при каждом запросе, но на самом деле это никогда не вызывает видимой ошибки.
По существу это становится функционально эквивалентным этому:
app.use('/public', function(req, res, next) {
// do nothing, just causes the request to get stuck since
// the request is not handled (no response is sent)
// and next is never called
});
Запрос никогда не обрабатывается и никогда не вызывается для перехода к другим обработчикам маршрутов, поэтому запрос просто застревает и в конечном итоге истекает.