Подтвердить что ты не робот

Render raw HTML

Я хочу сделать raw .html страницы с помощью Express 3 следующим образом:

server.get('/', function(req, res) {
    res.render('login.html');
}

Вот как я настроил сервер, чтобы отображать необработанные HTML-страницы (вдохновленные этим устаревшим вопросом):

server
    .set('view options', {layout: false})
    .set('views', './../')
    .engine('html', function(str, options) {
        return function(locals) {
             return str;
        };
    });

К сожалению, при этой конфигурации страница зависает и никогда не отображается должным образом. Что я сделал не так? Как я могу обработать необработанный HTLM с помощью Express 3 без фантастических движков рендеринга, таких как Jade и EJS?

4b9b3361

Ответ 1

Если вам действительно не нужно вводить данные в шаблоны, самым простым решением в экспресс является использование статического файлового сервера (express.static()).

Однако, если вы все еще хотите вручную подключить маршруты к страницам (например, ваш пример сопоставления '/' в 'login.html'), вы можете попробовать res.sendFile() отправить ваши html-документы:

http://expressjs.com/api.html#res.sendfile

Ответ 2

Я думаю, что вы пытаетесь сказать: Как я могу обслуживать статические html файлы, правильно?

Давайте перейдем к нему.

Во-первых, некоторый код из моего собственного проекта:

app.configure(function() {
    app.use(express.static(__dirname + '/public'));
});

Что это означает, что в папке моего приложения есть папка с именем public. Здесь все мое статическое содержимое, такое как css, js и даже html-страницы.

Чтобы отправить статические html-страницы, просто добавьте это в свой файл приложения

app.get('/', function(req, res) {
  res.sendFile(__dirname + '/public/layout.html');
});

Итак, если у вас есть домен под названием xyz.com; всякий раз, когда кто-то туда отправляется, они будут обслуживаться layout.html в своих браузерах.

Edit

Если вы используете экспресс-4, все немного отличается. Маршруты и промежуточное программное обеспечение выполняются точно в том же порядке, в котором они размещены.

Одним из хороших методов является статический файл, обслуживающий код сразу после всех стандартных маршрутов. Вот так:

// All standard routes are above here
app.post('/posts', handler.POST.getPosts);

// Serve static files
app.use(express.static('./public'));

Это очень важно, поскольку оно потенциально устраняет узкое место в вашем коде. Взгляните на этот fooobar.com/questions/25067/... (первый, где он говорит об оптимизации)

Другим важным изменением для express 4.0 является то, что вам не нужно использовать app.configure()

Ответ 3

Вы пытались использовать модуль fs?

server.get('/', function(req, res) {
    fs.readFile('index.html', function(err, page) {
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.write(page);
        res.end();
    });
}

Ответ 4

как говорится в документе: "Функция Express ожидает: (путь, параметры, обратный вызов)" в app.engin(...).

чтобы вы могли написать свой код, как показано ниже (для простоты, но он работает):

server
.set('view options', {layout: false})
.set('views', './../')
.engine('html', function(path, options, cb) {
    fs.readFile(path, 'utf-8', cb);
});

конечно, как 2 # и 3 # сказал, вы должны использовать express.static() для статической передачи файлов; и код, который не подходит для производства

Ответ 5

Во-первых, ошибка, которую вы делали, заключалась в попытке использовать фрагмент кода express 2.x для рендеринга необработанного HTML в express 3.0. Начиная с версии 3.0, только путь к файлу будет передан для просмотра движка вместо содержимого файла.

Приступая к решению,

создать простой механизм просмотра

var fs = require('fs'); 

function rawHtmlViewEngine(filename, options, callback) {
    fs.readFile(filename, 'utf8', function(err, str){
        if(err) return callback(err);

        /*
         * if required, you could write your own 
         * custom view file processing logic here
         */

        callback(null, str);
    }); 
}

используйте его так

server.engine('html', rawHtmlViewEngine)
server.set('views', './folder');
server.set('view engine', 'html');


Ссылка

Официальное экспресс-руководство по перемещению 2.x в 3.x

См. раздел "Интеграция с двигателем шаблонов" в этом URL-адресе https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x

Ответ 6

После новой установки последней версии Express

express the_app_name

Создает каталог скелета, который включает app.js.

В app.js есть строка, которая гласит:

  app.use(express.static(path.join(__dirname, 'public')));

Итак, папка с именем public - это то, где происходит волшебство...

Затем выполняется маршрутизация с помощью функции, моделируемой следующим образом:

app.get('/', function(req,res) {
      res.sendfile('public/name_of_static_file.extension');
    });

* Пример: * index.html внутри общей папки обслуживается при вызове строки:

   app.get('/', function(req,res) {
  res.sendfile('public/index.html');
});

Что касается активов: Убедитесь, что файлы css и javascript вызываются из папки по отношению к папке public.

Установщик vanilla Express будет иметь таблицы стилей, javascripts и изображения для запуска папок. Поэтому убедитесь, что скрипты и css-листы имеют правильные пути в index.html:

Примеры:

<link href="stylesheets/bootstrap.css" rel="stylesheet">

или

<script src="javascripts/jquery.js"></script>

Ответ 7

Вы можете отображать .html страницы в экспресс, используя следующий код: -

var app = express();

app.engine('html', ejs.__express);

И при рендеринге вы можете использовать следующий код: -

response.render('templates.html',{title:"my home page"});

Ответ 8

Я хотел сделать это, потому что я создаю шаблонный NodeJS-сервер, который я не хочу привязывать к механизму просмотра. Для этого полезно иметь механизм рендеринга placeholder, который просто возвращает содержимое файла (html).

Вот что я придумал:

//htmlrenderer.js

'use strict';

var fs = require('fs'); // for reading files from the file system

exports.renderHtml = function (filePath, options, callback) { // define the template engine
    fs.readFile(filePath, function (err, content) {
        if (err) return callback(new Error(err));
        var rendered = content.toString();
        // Do any processing here...
        return callback(null, rendered);
    });
};

Чтобы использовать его:

app.engine('html', htmlRenderer.renderHtml);
app.set('view engine', 'html');

Источник: http://expressjs.com/en/advanced/developing-template-engines.html

Комментарии и конструктивная обратная связь приветствуются!

Ответ 9

Через несколько лет появился новый ответ.

На самом деле такой подход, как skypecakes answer;

var fs = require('fs');

app.get('/', function(req, res, next) {
    var html = fs.readFileSync('./html/login.html', 'utf8')
    res.send(html)
})

Что все...

Также, если используется EJS или Jade, может использоваться следующий код:

var fs = require('fs');

app.get('/', function(req, res, next) {
    var html = fs.readFileSync('./html/login.html', 'utf8')
    res.render('login', { html: html })
})

И views/login.ejs файл содержит только следующий код:

<%- locals.html %>

Ответ 10

app.get('/', function(req, res) {
  returnHtml(res, 'index');
});

function returnHtml(res, name) {
  res.sendFile(__dirname + '/' + name + '.html');
}

И поместите ваш index.html на вашу корневую страницу, конечно, вы можете создать папку /views, например, и расширить функцию returnHtml().