Сбой узла при использовании экспресс-и статического промежуточного программного обеспечения, когда URL содержит обратную косую черту - PullRequest
1 голос
/ 07 января 2012

У меня есть простой сервер Express, который обслуживает некоторые статические файлы. Вот сервер:

var express = require('express');
var app = express.createServer();

// Configuration
app.configure(function() {
    app.use(express.bodyParser());
    app.use(express.staticCache());
    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

// 404
app.get('*', function(req, res) {
    res.send('not found', 404);
});

app.listen(3000);

В моем публичном каталоге у меня есть файл с именем index.html. При запуске node app.js и последующем просмотре localhost:3000/index.html статический файл отображается ожидаемым образом. Переход к localhost:3000/ind или localhost:3000/ind\ показывает страницу 404, как и ожидалось.

Однако переход к localhost:3000/index.html\ (обратите внимание на обратную косую черту) приводит к сбою моего node сервера с:

stream.js:105
      throw er; // Unhandled stream error in pipe.
        ^
Error: ENOENT, no such file or directory  '/home/bill/projects/app/public/index.html\'

Почему сервер node падает, а не просто обслуживает страницу 404? Я подумал, что поскольку файл не существует, статическое промежуточное ПО просто пропустит его и передаст запрос на маршруты. Я справился с этим, создав специальное промежуточное программное обеспечение, которое возвращает 404, если в URL-адресе запроса существует завершающая обратная косая черта, но я хотел бы выяснить, не упустил ли я что-то здесь. Спасибо!

1 Ответ

1 голос
/ 07 января 2012

Причиной такого поведения, по-видимому, является различие в том, как fs.stat и fs.createReadStream обрабатывают конечные обратные слэши.

Когда строка 'path/to/public/index.html\\' присваивается fs.stat в статическом промежуточном программном обеспечении, она игнорируется (при запуске stat index.html\ в командной строке проверяется файл с именем index.html, вам следует должен запустить stat index.html\\ для index.html\). Поэтому fs.stat считает, что файл найден, потому что думает, что вы запрашиваете index.html, и не вызывает следующий обработчик промежуточного программного обеспечения.

Позже эта строка передается в fs.createReadStream, которая думает, что ищет index.html\. Он не находит этот файл и выдает ошибку.

Поскольку функции по-разному обрабатывают обратную косую черту, вы ничего не можете сделать, кроме как использовать промежуточное программное обеспечение для фильтрации этих запросов.

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