Управление BAS из вне



  • Здравствуйте, появилась возможность использования Node.js и я решил удаленно управлять BAS. Выбор пал на express, но возникла проблема при первом запуске.

    1. Сервер продолжает работать после выполнения.
    2. Как заставить ожидать действие, не вставлять таймаут, а ожидать события '/quit'

    http://expressjs.com/ru/starter/hello-world.html

    var express = require('express');
    var app = express();
    
    app.get('/', function (req, res) {
      res.send('Hello World!');
    //Что тут можно вставить, что бы ожидать действие, а то скрипт отрабатывает и все
    
    });
    
    app.get('/quit', function (req,res) {
      res.send('closing..');
      app.close(); // Закрываю сервер
      process.exit(0); // Убиваю процесс
    });
    
    app.listen(3000, function () {
      console.log('Example app listening on port 3000!');
    });
    


  • @myweb101 нужно юзать awayt -> resolve
    Смотрите видос который вышел с релизом даной функции



  • Не помогает. Я возможно не правильно использую. Но я только начал вникать в js.

    await (new Promise((resolve, reject) => {
    	var express = require('express');
    var app = express();
    
    app.get('/', function (req, res) {
      res.send('Hello World!');
    });
    
    app.get('/quit', function (req,res) {
      res.send('closing..');
      app.close();
      process.exit(0);
    });
    
    app.listen(3000, function () {
      console.log('Example app listening on port 3000!');
    });
    	resolve()
    }));
    
    
    

    И так не работает

    await(new Promise((resolve, reject) => {
        var express = require('express');
        var app = express();
        app.get('/', function (req, res) {
            res.send('<h1>Hello World!</h1>');
        });
    
        app.get('/quit', function (req, res) {
            res.send('closing..');
            app.close();
            process.exit(0);
            console.log('Exit');
            resolve();
        });
    
        app.listen(3000, function () {
             console.log('Example app listening on port 3000!');
        });
        
    }));
    


  • @myweb101 Второй вариант должен работать.



  • @support Работает, но не выходит, сервер не закрывается, висит в процессах.
    app.close(); не работает.
    Я так же после await использовал
    await BAS_API("success("EXIT BAS")");
    Но все равно сервер работает.



  • @myweb101 Ветка старая, но всё же, вдруг понадобится кому..

    await(new Promise((resolve, reject) => {
        var express = require('express');
        var app = express();
        app.get('/', function (req, res) {
            res.send('<h1>Hello World!</h1>');
        });
    
        app.get('/quit', function (req, res) {
            res.send('closing..');
            server.close();
            console.log('Exit');
            resolve();
        });
    
    var server = app.listen(3000, function () {
             console.log('Example app listening on port 3000!');
        });
        
    }));
    

    Интересная тема так то, можно вешать обработчики запросов..



  • Вот например тестовый проект. Запускает сервер и ждёт данные из get-запроса вида:

    127.0.0.1:3000/quit?pr1=1&pr2=2&pr3=3
    

    Отображает на странице данные параметров:
    0_1521933724644_на форум 1.png
    Сохраняет полученные данные в переменные [[PR_1]], [[PR_2]], [[PR_3]]
    0_1521933873626_на форум 2.png

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



  • @Fox Спасибо выручил по больше бы таких примеров



  • @Fox said in Управление BAS из вне:

    127.0.0.1:3000/quit?pr1=1&pr2=2&pr3=3

    а как убрать таймаут в ноде чтобы ждал бесконечно, есть варианта без опроса в цикле?



  • 0_1521999720245_test242-получаем-из-запроса-данные.xml
    Как то странно работает открываю в хроме http://127.0.0.1:3000/ показывает цифру 1 обновляю тоже показывает 1 открываю браузер инкогнито показывает 2 обновляю тоже показывает 2 закрываю обновляю на обычной версии показывает 3 потом обновляю в инкогнито показывает 4 если обновить вкладку почему та не срабатывает скрипт



  • @GamiD Смотри, строчка:

    res.send("="+[[NEW_VARIABLE]]+"=");
    

    Говорит, что твой сервер будет отдавать данные, то есть рисовать страничку.
    Далее у тебя в скрипте стоит Увеличить переменную, которую ты показываешь на этой странице.
    Получается ты заходишь на страницу и получаешь значение [[NEW_VARIABLE]], чтобы сработал await должна сработать функция app.get('/',, которая ждёт после адресса слеш:

    http://127.0.0.1:3000/
    


  • Интересная особенность сервера в том, что после запуска в BAS он работает автономно. То есть скрипт в BAS выполняет следующие любые действия, а сервер при этом работает независимо от скрипта.

    Вот тестовый скрипт с простым счётчиком.
    0_1522005582778_на форум 4.png


    Запустите скрипт в режиме записи, выполните экшен node js и пока не закроете скрипт счётчик будет работать.



  • Кстати можно и без await:

        var i = 0;
        var express = require('express');
        var app = express();
        app.get('/1', function (req, res) {
            res.send('<a href="http://127.0.0.1:3000/1">http://127.0.0.1:3000/1</a> ='+ i +'=');
            ++i;
            console.log('Next');
    
        });
    
    var server = app.listen(3000, function () {
             console.log('Example app listening http://127.0.0.1:3000/1');
        });
    

    Интересно как можно получать данные из сервера node js в BAS на живую...



  • Оказалось что получать данные из сервера node js можно через глобальные переменные node js :D.
    0_1522010788590_на форум2.gif



  • This post is deleted!


  • @GamiD На будущие, когда написали пост, перечитайте его сами, всё ли вы понятно объяснили?
    Скиньте скрипт, а то по сообщениям будем долго гадать.



  • @Fox Исправлюсь =) запускаю 2 потока на первом потоке скрипт работает без сервера с переменными во втором потоке запускается node, после запуска сервера первый поток перестает работать когда открываешь адрес http://127.0.0.1:3000 второй поток где есть node перезагружается тогда работает несколько секунд первый поток и обратно зависает
    тоесть зависает полностью бас



  • @GamiD Вы же читали выше?

    При попытке запуска двух серверов (например, в многопотоке) – будет конфликт портов и ошибка.

    Вот тестовый скрипт , работающий в два потока. В первом определяется сервер, во втором выводит в лог надпись Test каждые 10 секунд. Всё работает и ни чего не зависает.



  • @Fox А я не запускаю 2 сервера а сервер запускается только во втором потоке а первый поток получает данные через http клиент и записывает в текстовый файл а второй поток где запускается сервер он читает данные из текстового файла и выводит через сервер



  • @Fox второй поток где у меня запускается сервер он делает так читает 3 файла через for и проверяет есть там текст который нужен или нет если есть идет дальше и запускает сервер если нет проверяет постоянно вот во время проверки бас зависает как только я в ручную добавляю в текстовый файл нужный текст сразу бас оживляется и после того как доходит обратно до проверки текста зависает завтра покажу проект


Log in to reply