2016-07-25 7 views
3

Я пишу простое приложение в node.js, по какой-то причине я получаю сообщение об ошибке «TypeError: путь должен быть абсолютным или указать корень в res.sendFile« когда пытаясь обслуживать мою страницу html. Эта ошибка не должна иметь место, потому что я использовал специальное промежуточное программное обеспечение, которое указывает папку, в которой этот файл можно найти. Так почему я получаю эту проблему?Приложение Node.js не обслуживает статическую веб-страницу без корневого пути

Моя структура приложения выглядит следующим образом

MyApp 
    public 
     login.html 
    app.js 

Мой HTML страницы в настоящее время служил в app.js как этот

var express = require("express"); 
var app = express(); 

app.use(express.static("public")); 

app.get('/', function(req, res){ 
    res.sendFile("login.html"); 
}); 

app.listen(3000); 

Я знаю, чтобы обойти это, я могу сделать «res.sendFile (__dirname + '/public/login.html'); " вместо этого, но мне не нужно, поскольку я использую промежуточное ПО. Есть идеи?

+0

Это несколько сбивает с толку, вы ожидаете, что Node должен смотреть в «общедоступной» папке, когда вы даете 'sendFile()' имя файла? Это не так, но загружаются только статические файлы при обращении непосредственно, поэтому имя «статическое». – adeneo

+0

Какая у вас ОС? –

+0

@adeneo да, я ожидаю, что он будет выглядеть в общей папке, потому что login.html является статическим – OneMoreQuestion

ответ

0

Эта линия

app.use(express.static("public")); 

не делать то, что вы думаете, что делает!

Это не установить папку по умолчанию для каждой функции узла, на самом деле она ничего не делает для других функций узла.

Он просто говорит, что если веб-сервер получает запрос, сначала посмотрите в эту папку, чтобы увидеть, существует ли такой файл, и если да, то выполните этот файл.

Следовательно, это маршрут для статических файлов, наиболее часто используемый для файлов CSS и JavaScript, и, конечно же, любой другой статический файл, который не обслуживает динамический контент.

Однако эта линия

res.sendFile("login.html"); 

ищет файл login.html в текущем рабочем каталоге, или другими словами, где вы Узла скрипт работает, он не имеет вообще ничего общего с статический маршрут, на самом деле правильный путь, чтобы получить этот файл, независимо от того, где ваш скрипт работает, точно сделать

res.sendFile(__dirname + '/public/login.html'); 

, как это правильный путь, который необходим для sendFile, чтобы найти файл.

+0

wait is login.html не статический файл? – OneMoreQuestion

+0

@OneMoreQuestion - это действительно так, если вы обращаетесь к нему как 'http: // mywebsite/login.html', вы даже можете получить его со статическим ** маршрутом **, однако это не заставит' sendFile' внезапно работать с этот статический маршрут, который был настроен * для веб-сервера *. Точка, статический маршрут не имеет ничего общего с остальными функциями в узле, он позволяет веб-серверу обслуживать статические файлы в браузере. – adeneo

+0

Вы говорите, что «sendFile» не подходит, я хочу использовать промежуточное программное обеспечение, я тоже попробовал «рендеринг», но затем я столкнулся с проблемой рендеринга двигателя. Есть ли лучший способ, если я хочу воспользоваться промежуточным программным обеспечением? – OneMoreQuestion

0

Добавить функцию, которая дает вам полный путь, давайте назовем эту функцию $

var $=(file)=>`${__dirname}/public/${file}`; 

Тогда:

res.sendFile($("login.html")); 

К этому, вам не нужно будет включать корневой путь вручную для каждого sendFile вызов .

Смежные вопросы