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

Тест 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 и использую его в основном файле.


После запуска в 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. Ну может в модулях многопоточно некорректно отрабатывают или еще что. Добавляю паузу на каждый поток, чтобы такой ситуации не повторялось.

И теперь вообще непонятно что происходит, поток который в Тесте 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)
-
Много причин:
- Куда проще скопировать кубик и вставить его в JS-код.
- Не все аргументы можно выставить через параметры функции. Я пока никак не пойму, как можно выставить булевы переменные:

- Я сам бывший программист, мне намного проще написать враппер над функциями BAS и использовать их в логике на ноде, чем возиться с кубиками.
- Использование 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\"]"); }
Тестовый скрипт
Но вызывать функции 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 получается что-то вроде такого:

В Вашем примере Вы вынесли использование [[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 будет в открытом виде.
Про надежность - понятно, сам код скрипт может изменяться от версии к версии, а в моем коде ничего не изменится, это я принимаю. По поводу компиляции и защиты - меня это вообще никак не беспокоит, это не публичный проект.
Мне намного проще визуально, и быстрее по времени написать такой код, чем кубиками складывать его:

Все в одном месте и сразу понятно что есть что. -
@luka said in Проблемы с вызовом BAS_API File Search из Node.JS:
В Вашем примере Вы вынесли использование [[RESULT]] из модуля - а в этом, похоже, и есть сам баг. К примеру, если в модуле использовать более простую функцию API BAS, то ошибка остается:
ответ @support
Исправлю в следующей