Проблемы с вызовом BAS_API File Search из Node.JS



  • Добрый день!
    Windows 10 x64, BAS 22.1.2
    Пробую поработать с BAS_API непосредственно из Node.js. Добрался до функционала File Search, есть необходимость найти все дочерние каталоги в указанной подпапке.

    Исходные данные:
    Для теста использую одну пустую подпапку и один пустой файл:
    0_1569329554882_1569329471114.png

    Тест 1.
    Сперва накидал всё на кубиках - никаких проблем ни в режиме Записи, ни в Запуске в 10 потоков.

    Тест 2.
    Перенес код скрипта в Node.js - никаких проблем ни в режиме Записи, ни в Запуске в 10 потоков.

    var TESTDIR = "d:/temp/filesearch/";
    
    async function fileSearch(folder, mask = '*', mustContain = '', includeFolders = true, includeFiles = true, recursive = true) {
        await BAS_API("native_async(\"filesystem\", \"search\", JSON.stringify({folder: \"" + folder + "\",mask: \"" + mask + "\",contains:\"" + mustContain + "\",include_folders:" + includeFolders + ",include_files:" + includeFiles + ",recursive:" + recursive + "}))!\nVAR_RESULT = JSON.parse(_result())[\"d\"]");
        return [[RESULT]];
    }
    console.log("Результат через Node.JS: " + await fileSearch(TESTDIR, "*", '', true, false, false));
    

    Тест 3.
    Перенес код для поиска файлов в модуль Node.js и использую его в основном файле.
    0_1569329965406_1569329471114.png
    0_1569329998350_1569329471114.png

    После запуска в 10 потоков, всего для одного потока результат был ожидаемым:

    198888837] [16:01:04] Thread #1 : Результат через Node.JS: before BAS API
    [198888837] [16:01:04] Thread #2 : Результат через Node.JS: before BAS API
    [878394547] [16:01:04] Thread #1 : Результат через кубики: d:/temp/filesearch/emptyfolder
    [16:01:04] Thread #1 : Thread succeeded with message "Ok"
    [198888837] [16:01:04] Thread #3 : Результат через Node.JS: before BAS API
    [878394547] [16:01:04] Thread #2 : Результат через кубики: d:/temp/filesearch/emptyfolder
    [16:01:04] Thread #2 : Thread succeeded with message "Ok"
    [198888837] [16:01:04] Thread #4 : Результат через Node.JS: before BAS API
    [878394547] [16:01:04] Thread #3 : Результат через кубики: d:/temp/filesearch/emptyfolder
    [16:01:04] Thread #3 : Thread succeeded with message "Ok"
    [198888837] [16:01:04] Thread #5 : Результат через Node.JS: before BAS API
    [878394547] [16:01:04] Thread #4 : Результат через кубики: d:/temp/filesearch/emptyfolder
    [16:01:04] Thread #4 : Thread succeeded with message "Ok"
    [198888837] [16:01:04] Thread #6 : Результат через Node.JS: before BAS API
    [878394547] [16:01:04] Thread #5 : Результат через кубики: d:/temp/filesearch/emptyfolder
    [16:01:04] Thread #5 : Thread succeeded with message "Ok"
    [198888837] [16:01:04] Thread #7 : Результат через Node.JS: before BAS API
    [878394547] [16:01:04] Thread #6 : Результат через кубики: d:/temp/filesearch/emptyfolder
    [16:01:04] Thread #6 : Thread succeeded with message "Ok"
    [198888837] [16:01:04] Thread #8 : Результат через Node.JS: before BAS API
    [878394547] [16:01:04] Thread #7 : Результат через кубики: d:/temp/filesearch/emptyfolder
    [16:01:04] Thread #7 : Thread succeeded with message "Ok"
    [198888837] [16:01:04] Thread #9 : Результат через Node.JS: before BAS API
    [878394547] [16:01:04] Thread #8 : Результат через кубики: d:/temp/filesearch/emptyfolder
    [16:01:04] Thread #8 : Thread succeeded with message "Ok"
    [198888837] [16:01:04] Thread #10 : Результат через Node.JS: d:/temp/filesearch/emptyfolder
    [878394547] [16:01:04] Thread #9 : Результат через кубики: d:/temp/filesearch/emptyfolder
    [16:01:04] Thread #9 : Thread succeeded with message "Ok"
    [878394547] [16:01:04] Thread #10 : Результат через кубики: d:/temp/filesearch/emptyfolder
    [16:01:04] Thread #10 : Thread succeeded with message "Ok"
    [16:01:04] Script finished correctly
    

    Тест 4
    Ну, думаю, рассинхрон какой-то, возможно с переменными BAS. Ну может в модулях многопоточно некорректно отрабатывают или еще что. Добавляю паузу на каждый поток, чтобы такой ситуации не повторялось.
    0_1569330311631_1569329471114.png

    И теперь вообще непонятно что происходит, поток который в Тесте 3 возвращал правильный результат отработал, а остальные висят и завершают свою работу по таймауту:

    [198888837] [16:05:26] Thread #9 : Результат через Node.JS: d:/temp/filesearch/emptyfolder
    [878394547] [16:05:26] Thread #9 : Результат через кубики: d:/temp/filesearch/emptyfolder
    [16:05:26] Thread #9 : Thread succeeded with message "Ok"
    [198888837] [16:06:26] Thread #1 : Thread ended with message "Embedded language execution timeout"
    [198888837] [16:06:26] Thread #2 : Thread ended with message "Embedded language execution timeout"
    [198888837] [16:06:26] Thread #3 : Thread ended with message "Embedded language execution timeout"
    [198888837] [16:06:26] Thread #4 : Thread ended with message "Embedded language execution timeout"
    [198888837] [16:06:26] Thread #5 : Thread ended with message "Embedded language execution timeout"
    [198888837] [16:06:27] Thread #6 : Thread ended with message "Embedded language execution timeout"
    [198888837] [16:06:27] Thread #7 : Thread ended with message "Embedded language execution timeout"
    [198888837] [16:06:27] Thread #8 : Thread ended with message "Embedded language execution timeout"
    [198888837] [16:06:27] Thread #10 : Thread ended with message "Embedded language execution timeout"
    [16:06:27] Script finished correctly
    

    Тест 5
    Ну и последний тест - проверил что пауза в Node.js без другого функционала нормально работает - так и есть.

    Собственно, тут возможно не один баг, но в чем его суть мне сложно понять.
    Файл с проектом прикладываю.
    0_1569330709993_filesearch.xml



  • @luka said in Проблемы с вызовом BAS_API File Search из Node.JS:

    Добрый день!
    Windows 10 x64, BAS 22.1.2
    Пробую поработать с BAS_API непосредственно из Node.js. Добрался до функционала File Search, есть необходимость найти все дочерние каталоги в указанной подпапке.

    Собственно, тут возможно не один баг, но в чем его суть мне сложно понять.
    Файл с проектом прикладываю.

    Я пока разбираюсь, но для чего использовать именно api BAS из node js? Можно же вызывать функции BAS из node:

    var TESTDIR = "C:/test/14/";
    
    var result = await BAS_FUNCTION(
    	"fileSearch", 
    	{"path": TESTDIR}
    )
    console.log("Результат через Node.JS: " + result)
    

    0_1569387496885_b9bd8c93-26c5-4452-9176-f326ffe1f579-изображение.png



  • Много причин:

    1. Куда проще скопировать кубик и вставить его в JS-код.
    2. Не все аргументы можно выставить через параметры функции. Я пока никак не пойму, как можно выставить булевы переменные:
      0_1569402258275_1569329471114.png
    3. Я сам бывший программист, мне намного проще написать враппер над функциями BAS и использовать их в логике на ноде, чем возиться с кубиками.
    4. Использование BAS_FUNCTION в модулях выдает ошибку
    [926841380] [12:06:30] Thread #8 : Thread ended with message "TypeError: module.parent.BAS_FUNCTION is not a function"
    

    Поправленный тестовый проект для использования в модулях BAS_FUNCTION прикладываю
    0_1569402434652_filesearch.xml



  • @luka said in Проблемы с вызовом BAS_API File Search из Node.JS:

    текущий:

    var TESTDIR = "C:/test/14/"
    var fileSearch = require("../bas.js");
    await fileSearch(TESTDIR, "*", '', true, false, false)
    console.log("Результат через Node.JS: " + [[RESULT]]);
    

    модуль bas.js:

    module.exports = async function(folder, mask = '*', mustContain = '', includeFolders = true, includeFiles = true, recursive = true) {
                return BAS_API("native_async(\"filesystem\", \"search\", JSON.stringify({folder: \"" + folder + "\",mask: \"" + mask + "\",contains:\"" + mustContain + "\",include_folders:" + includeFolders + ",include_files:" + includeFiles + ",recursive:" + recursive + "}))!\nVAR_RESULT = JSON.parse(_result())[\"d\"]");
    }
    

    0_1569402072683_5cab15b1-32dc-4fe4-ba80-196cb5316bd9-изображение.png

    Тестовый скрипт


    Но вызывать функции BAS в разы проще и надёжнее, чем использовать апи BAS в модулях ноды. После компиляции скрипта (даже с защитой) весь код node js будет в открытом виде.



  • @fox спасибо за пример, но этот код как раз просто обходит баг, который я озвучил.

    Если в bas.js написать

    module.exports = async function (folder, mask = '*', mustContain = '', includeFolders = true, includeFiles = true, recursive = true) {
        await BAS_API("native_async(\"filesystem\", \"search\", JSON.stringify({folder: \"" + folder + "\",mask: \"" + mask + "\",contains:\"" + mustContain + "\",include_folders:" + includeFolders + ",include_files:" + includeFiles + ",recursive:" + recursive + "}))!\nVAR_RESULT = JSON.parse(_result())[\"d\"]");
        return [[RESULT]];
    }
    

    то все опять работает по-старому.

    Я пытаюсь раскидать всю вспомогательную логику по разным модулям, проект большой и писать в одном файле или тем более использовать визуальный конструктор - в разы увеличит время разработки. Для враппера BAS получается что-то вроде такого:
    0_1569403912358_1569329471114.png

    В Вашем примере Вы вынесли использование [[RESULT]] из модуля - а в этом, похоже, и есть сам баг. К примеру, если в модуле использовать более простую функцию API BAS, то ошибка остается:

    module.exports = async function () {
        await BAS_API("VAR_RESULT = thread_number()");
        return [[RESULT]];
    }
    

    @fox said in Проблемы с вызовом BAS_API File Search из Node.JS:

    Но вызывать функции BAS в разы проще и надёжнее, чем использовать апи BAS в модулях ноды. После компиляции скрипта (даже с защитой) весь код node js будет в открытом виде.

    Про надежность - понятно, сам код скрипт может изменяться от версии к версии, а в моем коде ничего не изменится, это я принимаю. По поводу компиляции и защиты - меня это вообще никак не беспокоит, это не публичный проект.
    Мне намного проще визуально, и быстрее по времени написать такой код, чем кубиками складывать его:
    0_1569404503666_1569329471114.png
    Все в одном месте и сразу понятно что есть что.



  • @luka said in Проблемы с вызовом BAS_API File Search из Node.JS:

    В Вашем примере Вы вынесли использование [[RESULT]] из модуля - а в этом, похоже, и есть сам баг. К примеру, если в модуле использовать более простую функцию API BAS, то ошибка остается:

    ответ @support

    Исправлю в следующей
    


  • Оооо, спасибо, очень будем ждать!!!


Log in to reply