Node.js Создать html

Я создал программу JavaScript, которая генерирует список данных. Пример вывода ниже:

output one 
output two 
output three 
...

Я хотел бы иметь возможность создавать HTML файл, который можно сохранить на диск и открыть с помощью браузера. Ниже приведен пример HTML-кода, который я хотел бы создать.

<html>
    <head>
    </head>
    <body>
        <table id="history_table">
            <tr>
                <td>header 1</td>
                <td>header 2</td>
                <td>header 3</td>
            </tr>
            <tr>
               <td>output one</td>
            </tr>
            ...
        </table>
    </body>
</html>

Я пытался сделать это:

var htmlDoc = document.createElement("HMTL");
htmlDoc.innerhtml('<head></head><body>...</body>');

Но это явно неправильно, так как объект документа не существует.

Я думаю, что этот вопрос имеет смысл, особенно с учетом количества полученных голосов. это может быть вновь открыто?

Ответы

Ответ 1

Node.js не запускается в браузере, поэтому у вас не будет доступного объекта document. На самом деле, у вас даже не будет дерева DOM. Если вы немного запутались в этом вопросе, я призываю вас прочитать больше об этом, прежде чем идти дальше.

Есть несколько методов, которые вы можете выбрать, чтобы делать то, что вы хотите.


Способ 1: подача файла напрямую через HTTP

Поскольку вы писали об открытии файла в браузере, почему бы вам не использовать среду, которая будет обслуживать файл непосредственно как HTTP-сервис, вместо двухэтапного процесса? Таким образом, ваш код будет более динамичным и легко обслуживаемым (не говоря уже о том, что ваш HTML всегда актуален).

Для этого есть множество рамок:

Самый простой способ сделать то, что вы хотите, это:

var http = require('http');

http.createServer(function (req, res) {
  var html = buildHtml(req);

  res.writeHead(200, {
    'Content-Type': 'text/html',
    'Content-Length': html.length,
    'Expires': new Date().toUTCString()
  });
  res.end(html);
}).listen(8080);

function buildHtml(req) {
  var header = '';
  var body = '';

  // concatenate header string
  // concatenate body string

  return '<!DOCTYPE html>'
       + '<html><head>' + header + '</head><body>' + body + '</body></html>';
};

И получите доступ к этому HTML с http://localhost:8080 из вашего браузера.

(Изменить: вы также можете обслуживать их с небольшим HTTP- сервером.)


Способ 2: создание только файла

Если то, что вы пытаетесь сделать, это просто генерировать некоторые HTML файлы, тогда идите проще. Чтобы выполнить IO-доступ к файловой системе, Node имеет API для этого, описанный здесь.

var fs = require('fs');

var fileName = 'path/to/file';
var stream = fs.createWriteStream(fileName);

stream.once('open', function(fd) {
  var html = buildHtml();

  stream.end(html);
});

Примечание. Функция buildHtml точно такая же, как и в методе 1.


Способ 3: сброс файла непосредственно в стандартный stdout

Это самая базовая реализация Node.js и требует, чтобы вызывающее приложение обрабатывало сам вывод. Для вывода чего-либо в Node (то есть в stdout) лучше всего использовать console.log(message) где message - любая строка или объект и т.д.

var html = buildHtml();

console.log(html);

Примечание: функция buildHtml точно такая же, как в методе 1 (снова)

Если ваш скрипт называется html-generator.js (например), в системе на основе Linux/Unix просто выполните

$ node html-generator.js > path/to/file

Заключение

Поскольку Node является модульной системой, вы даже можете поместить функцию buildHtml в свой собственный модуль и просто написать адаптеры для обработки HTML, как вам нравится. Что-то вроде

var htmlBuilder = require('path/to/html-builder-module');

var html = htmlBuilder(options);
...

Вы должны думать "на стороне сервера", а не "на стороне клиента" при написании JavaScript для Node.js; вы не находитесь в браузере и/или не ограничены песочницей, кроме движка V8.

Дополнительное чтение, узнать о нпм. Надеюсь это поможет.

Ответ 2

Хотя ответ @yanick-rochon верен, самый простой способ достичь вашей цели (если он служит для динамически генерируемого html):

var http = require('http');
http.createServer(function (req, res) {
  res.write('<html><head></head><body>');
  res.write('<p>Write your HTML content here</p>');
  res.end('</body></html>');
}).listen(1337);

Таким образом, когда вы просматриваете http://localhost:1337, вы получите свою страницу html.

Ответ 3

Если вы хотите создавать статические файлы, вы можете использовать Node.js File System для этого. Но если вы ищете способ создания динамических файлов в результате своей базы данных или похожих запросов, вам понадобится механизм шаблонов, например SWIG. Помимо этих параметров вы всегда можете создавать HTML файлы, как обычно, и обслуживать их через Node.js. Для этого вы можете читать данные из файлов HTML с помощью Node.js File System и записывать его в ответ. Простой пример:

var http = require('http');
var fs   = require('fs');

http.createServer(function (req, res) {
  fs.readFile(req.params.filepath, function (err, content) {
    if(!err) {
      res.end(content);
    } else {
      res.end('404');
    }
  }
}).listen(3000);

Но я предлагаю вам изучить некоторые рамки, такие как Express для более полезных решений.

Ответ 4

Вы можете использовать jade + express:

app.get('/', function (req, res) { res.render('index', { title : 'Home' } ) });

выше вы видите 'index' и объект {title: 'Home'}, 'index' - ваш html, а объект - ваши данные, которые будут отображаться в вашем html.