Node.js, обслуживающий файл HTML в удаленной сети

1

Я новичок Node.js, поэтому я не уверен, что можно сделать то, что я пытаюсь выполнить. Вот моя конфигурация:

У меня есть сервер Node.js, работающий на малине Pi в моей домашней сети. У меня есть HTML файл на внешнем IP-адресе. Я хочу отображать компоненты React в этом HTML файле.

Из того, что я видел, люди использовали серверы узлов для отображения js в локальном HTML файле, поэтому путь обычно будет выглядеть так, если каталог называется "dir":

const express = require('express');
const app = express();

// Static Routes
app.use('/dist', express.static(path.join(__dirname, 'dir')));

// App Route
app.get('/', (req, res, next) => res.sendFile(path.join(__dirname, 
'index.html')));

Который, насколько мне известно, передает HTML файл, найденный по ранее указанному пути. Но куда это переносится? В любом случае я могу указать имя пути на основе внешнего IP + пользователя + пароль и путь к файлу?

  • 1
    Что вы подразумеваете под «рендерингом компонентов Node.js»? Это просто не имеет смысла.
  • 0
    Дело в том, что если «файл» не находится в локальной файловой системе, вы не можете рассматривать его как файл. Если он доступен удаленно, должен быть способ получить этот удаленный ресурс, и это резко расширяет сферу вопроса. Предполагая, что «файл» доступен по HTTP, вы можете захотеть сделать к нему HTTP-запрос и направить ответ на этот запрос обратно пользователю.
Показать ещё 4 комментария
Теги:
networking
server

2 ответа

1
Лучший ответ

Который, насколько мне известно, передает HTML файл, найденный по ранее указанному пути. Но куда это переносится?

Он передает содержимое файла с диска на сетевое подключение клиента, когда он запрашивает его (то есть не при запуске сервера).

В любом случае я могу указать имя пути на основе внешнего IP + пользователя + пароль и путь к файлу?

Не с express.static. Если вы хотите, чтобы ваш сервер обслуживал внешнюю страницу (проксирование), вы можете сделать это: qaru.site/questions/56383/.... Поскольку у вас будет доступ к url & cookies, вы можете делать все, что хотите, с помощью пути/пользователя/пароля.

app.post('/my_url', function(req, res) {
  var options = {
    host:   MY_DOMAIN,
    path:   '/' + req.query.username,
    method: 'GET',
  };
  var req = http.request(options, function(res) {
    // etc...
    // send response to client
  }).on('error', function(e) {
    // handle error...
  }).end();
});

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

let myHtml = "";
let fn = () => {
  var options = {
    host:   MY_DOMAIN,
    path:   '/' + req.query.username,
    method: 'GET',
  };
  var req = http.request(options, function(res) {
    // etc...
    // save response to myHtml as string
  }).on('error', function(e) {
    // handle error...
  }).end();
};
setInterval(fn, 60000);
fn();
app.post('/my_url', function(req, res) {
  res.end(myHtml);
});
  • 0
    Спасибо, это привело меня в правильном направлении! Я смог получить индекс и файлы, которые я хотел через http. Однако, хотя все файлы, используемые моим index.html (css, js, шрифты, изображения), возвращаются со статусом 200 (ОК) с GET, когда я захожу на свою страницу в браузере, текст там без стиля, нет фото, а не JS. Как я могу это исправить?
1

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

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

  • 1
    Это близко, но ответ не полный. Не могли бы вы улучшить его, приведите пример кода в качестве примера?
  • 0
    Я чувствую, что вы и @ rm- на правильном пути. Я могу сделать HTTP-запрос, чтобы получить файл index.html. Как мне написать сценарий, который выполняет каждый запрос? И не могли бы вы объяснить, почему мне нужно будет получать новый HTML-файл для каждого запроса?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню