Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Управление бэкендом с клиента (https://javascript.ru/forum/node-js-io-js/75350-upravlenie-behkendom-s-klienta.html)

j0hnik 13.02.2019 12:52

Цитата:

Сообщение от Маэстро
Как оперируя только одной вебстраницей сделать reload сервера?

самый обычный POST запрос.

Маэстро 13.02.2019 12:57

Цитата:

Сообщение от j0hnik (Сообщение 503587)
самый обычный POST запрос.

Это безусловно POST-запрос. А дальше? Кто должен принять этот запрос и перезапустить myserver.js под Нодой? Если можно, то прошу код в пару строк... ;)

Audaxviator 13.02.2019 13:57

Надо у старика Мюнхаузена спросить, он что-то подобное проделывал.

Маэстро 20.02.2019 15:42

Сам себя за волосы не вытащишь. Тут помощники нужны. В помощники я взял nodemon и Apache/PHP, которые уже стоят на сервере.
Решение задачи:
Создаем HTML-форму, которая POST-запросом отправляет на сервер содержимое input-поля с именем "s". Форма вызывает PHP-скрипт startstop.php
Данный скрипт принимает числовой параметр s и сохраняет его в файл startstop.js в тот же каталог, где лежит server.js
Nodemon, как известно, засекает изменение файла startstop.js в каталоге и перегружает server.js

упрощенный код startstop.php:
<?
if (!isset($_POST['s'])) exit;
$s = trim(substr($_POST['s'],0,10));
settype($s,"integer");
file_put_contents('путь_к_каталогу_сервера/startstop.js', $s);
echo $s."\n";
?>

начало кода в server.js
var command = fs.readFileSync('startstop.js');
if (command == 1)
 {
 var s = 'server stopped ' + "\n"; 
 fs.appendFileSync('имя_лог_файла',s);
 return; // завершение работы сервера
 }
else
 {
 // действия при старте server.js
 var absd = command;
 };

Примечания:
1. в HTML-форме есть еще поле password, которое опущено в данном примере
2. файл startstop.js сначала хотел назвать startstop.txt, но nodemon на него не реагирует, несмотря на то, что в настройках значится watching:*.* (пока не понял почему)
3. для автора этого поста: HTML-форму можно сделать на PHP, добавить в неё чтение файла server.js и отправку в браузер в поле TEXTAREA. Соответственно, после внесения изменений, отправить POST-запросом на сервер, где скрипт startstop.php сначала сохранит новый файл server.js, что перезапустит Node.js-сервер с новым кодом.

j0hnik 23.02.2019 05:44

Apache зачем? nodejs прекрасно принимает пост запросы и работает с файлами.

Маэстро 24.02.2019 00:26

Цитата:

Сообщение от j0hnik (Сообщение 503963)
Apache зачем? nodejs прекрасно принимает пост запросы и работает с файлами.

затем, что если node-myserver.js погасить (остановить) или он вывалится по ошибке, то уже никто никакой post-запрос не примет и никакой файл не запишет.

j0hnik 24.02.2019 02:07

Цитата:

Сообщение от Маэстро
затем, что если node-myserver.js погасить (остановить) или он вывалится по ошибке, то уже никто никакой post-запрос не примет и никакой файл не запишет.

Вам же просто перезагружать надо, nodemon я так понимаю для этого и поставили.

Маэстро 24.02.2019 02:22

Цитата:

Сообщение от j0hnik (Сообщение 504005)
Вам же просто перезагружать надо, nodemon я так понимаю для этого и поставили.

Не только перезагружать. Сервер надо запускать, останавливать и перезапускать с разными (переданными) параметрами. И еще раз повотряю: если сервер вывалится с ошибкой, то как его перезапускать, имея в руках только смартфон и в нем браузер?

Audaxviator 24.02.2019 11:40

Хех. Ну вот я напейсал такой модуль под названием childProcessExecFile.js
var execFile = require('child_process').execFile;

function childProcessExecFile(p, ...args) {
	return new Promise(function(resolve, reject) {
		execFile(p, args, function(err) {
			if(err) resolve(err);
			resolve('OK');
		});
	});
}

module.exports = childProcessExecFile;

Потом напейсал такой модуль
var childProcessExecFile = require('./childProcessExecFile');

childProcessExecFile('node', 'absolute_path_to_serv/server.js')
	.then( ok => {
		console.log(ok);
	})
	.catch( err => {
		console.log(err);
	});

И запустил приложение.
Видимо, это может значить, что на том же VPS можно параллельно запустить ещё один сайтик и через него запускать/останавливать соседний.


Часовой пояс GMT +3, время: 09:20.