Javascript не загружается в файл HTML - nodejs + http

Отказ от ответственности: я новичок в node.js, поэтому я предполагаю, что на этот вопрос есть очень простой ответ.

Я использую node.js на Окна с модулем http для создания статической страницы с содержимым, созданным из файла js.

Файл сервера (server.js):

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

fs.readFile('./index.html', function (err, html) {
    if (err) {
        throw err;
    }
    http.createServer(function(request, response) {
        response.writeHeader(200, {"Content-Type": "text/html"});
        response.write(html);
        response.end();
    }).listen(8080);
});

HTML-файл (index.html):

<!DOCTYPE html>
<html>

<body>

<div id = "div1">
  <p id = "p1">This is a static paragraph.</p>
</div>

<p>
  <script type = "text/javascript" src = "start.js"></script>
</p>

</body>
</html>

JS файл (start.js)

var para = document.createElement("p");
var node = document.createTextNode("This text is loaded from a js file.");
para.appendChild(node);
var element = document.getElementById("div1");
element.appendChild(para);

Когда я загружаю index.html напрямую, я получаю следующий результат:

This is a static paragraph.

This text is loaded from a js file.

^^ это мой желаемый результат.

Проблема: Однако, когда я использую node.js и запускаю server.js, содержимое start.js не загружается. Я получил:

This is a static paragraph.

Любая помощь будет оценена по достоинству.

К вашему сведению, моя структура папок

/
- node_modules
-- http
-- fs
- index.html
- server.js
- start.js
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
0
4 338
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Кажется, ваша логика добавления дочерних узлов в порядке.

Я думаю, вам следует попробовать изменить свой src = "start.js" на src = "./start.js" или src = "/start.js", просто чтобы убедиться, что вы правильно указываете путь. Добавьте оператор console.info() в свой start.js, чтобы убедиться, что он загружается.

Обновлено: Убедитесь, что вы размещаете свой файл на своем сервере. Вы можете добавить что-нибудь вроде express или connect, чтобы помочь.

Чтобы использовать соединение, запустите npm install --save connect в каталоге вашего проекта.

var connect = require('connect'),
directory = '/path/to/Folder'; // probably just '/' for all your files

connect()
  .use(connect.static(directory))
  .listen(80);

console.info('Listening on port 80.');

Обратитесь к их документации для полных инструкций и других примеров использования http.

Я пробовал эти альтернативы, и путь указан правильно, однако файл не загружается, поскольку console.info() не ведет журналов. Я считаю, что проблема связана с тем, что упомянул @BharathRao, то есть "файла нет на сервере"

Wronski 01.10.2018 07:23

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

AndrewSteinheiser 01.10.2018 07:29

Я попробовал ваше решение, выполнив следующие инструкции по expressjs.com/en/starter/static-files.html, т.е. поместив start.js в папку /public, и это сработало! Спасибо.

Wronski 01.10.2018 08:00

Рад, что у вас все получилось! express тоже обычно мой выбор;)

AndrewSteinheiser 01.10.2018 08:02

Я думаю, что он не может найти js. Прежде чем ссылаться на js, убедитесь, что он находится на сервере, и вы можете загрузить его с сервера, например: 'http://127.0.0.1:8000/start.js'. Все наши статические файлы, такие как img, css, js, должны быть размещены на сервере, только тогда на них будет сделана ссылка.

Я подозреваю, что файл находится не «на сервере», потому что, когда я загружаю локальный: 8080 / start.js, я получаю следующую ошибку start.js:1 Uncaught SyntaxError: Unexpected token в консоли Chrome. Как мне добавить файл на сервер?

Wronski 01.10.2018 07:21

Если start.js выдает ошибку в строке 1, значит, он находится на сервере, у вас просто синтаксическая ошибка в строке 1. Какая у вас строка 1 этого файла? Дважды и трижды проверьте его на возможные ошибки.

guyot 01.10.2018 07:38

Каждый URL-адрес запроса, который вы получаете для файла, должен обрабатываться сервером узла. Я бы предложил использовать Express.js, так как это упростит обработку различных URL-адресов, а файлы можно будет обслуживать напрямую. Но если вам нужна чистая реализация на основе node.js, проверьте код ниже.

Чтобы передать файл с сервера, вам нужно будет изменить свой server.js примерно так:

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

http.createServer(function(request, response) {
    if (request.url=='/'){
        fs.readFile('./index.html', function (err, html) {
             if (err) {
                  res.send(500,{error: err});
             }
             response.writeHeader(200, {"Content-Type": "text/html"});
             response.write(html);
             response.end();
        });
    } else if (request.url=='/start.js'){
        fs.readFile('./start.js', function (err, jsFile) {
             if (err) {
                  res.send(500,{error: err});
             }
             response.writeHeader(200, {"Content-Type": "text/javascript"});
             response.write(jsFile);
             response.end();
        });
    }

}).listen(8080);

Надеюсь это поможет :)

Я попробовал это, и теперь страница загружается бесконечно. Я подозреваю, что это связано с тем, что сервер не может найти /start.js. Я собираюсь исследовать немного дальше.

Wronski 01.10.2018 07:40

@Wronski попробуйте отладить, чтобы узнать, какой URL-адрес вы получаете при загрузке для start.js, возможно, я что-то пропустил. Не стесняйтесь предлагать редактирование, если оно у вас есть.

dRoyson 01.10.2018 07:45

ваш код был правильным. У меня был другой файл .js, который вызывал бесконечную загрузку. Как только я удалил ссылку на этот файл, загрузился код, показывающий: This is a static paragraph. This text is loaded from a js file.

Wronski 01.10.2018 07:49

Другие вопросы по теме