Сервер перестает работать, если я обертываю express.static в функции - PullRequest
0 голосов
/ 16 июня 2019

работает код ниже:

var express = require('express');
var path  = require('path');
var app = express();
app.use('/public', express.static("./public"));
app.listen(3000, function () {
    console.log('Example app listening on port 3000!');
});

Но если я изменю app.use следующим образом:

var express = require('express');
var path  = require('path');
var app = express();
app.use('/public', function(){express.static("./public")}); 
// browser error "cannot GET /
app.listen(3000, function () {
    console.log('Example app listening on port 3000!');
});

Почему? Сервер, похоже, не ловит никаких ошибок

Ответы [ 2 ]

1 голос
/ 16 июня 2019

Вы можете попробовать:

  app.use(express.static(path.resolve(__dirname, './public'), { maxAge: '1d' }));
1 голос
/ 16 июня 2019

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
});

Запрос никогда не обрабатывается и никогда не вызывается для перехода к другим обработчикам маршрутов, поэтому запрос просто застревает и в конечном итоге истекает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...