Баг с переменными в модулях node.js



  • Доброго времени суток. Из модулей не читаются переменные BAS.
    Создаём новый кирпич node.js и пишем:

    await require("../InternalFunctions")();
    

    Добавляем файл InternalFunctions со следующим содержимым:

    module.exports = async function(){
        await BAS_API('VAR_TEST1 = "test";');
        console.log([[TEST1]]);
    };
    

    В выводе консоли ловим "undefined" вместо "test". В основном модуле тот же код работает как надо.



  • @Elemental said in Баг с переменными в модулях node.js:

    Доброго времени суток. Из модулей не читаются переменные BAS.
    Создаём новый кирпич node.js и пишем:

    await require("../InternalFunctions")();
    

    Добавляем файл InternalFunctions со следующим содержимым:

    module.exports = async function(){
        await BAS_API('VAR_TEST1 = "test";');
        console.log([[TEST1]]);
    };
    

    В выводе консоли ловим "undefined" вместо "test". В основном модуле тот же код работает как надо.

    await require("../InternalFunctions")();
    [[TEST1]]
    

    01b83530-baad-4e9f-ae74-78d8cac0c40c-изображение.png

    скрипт: 101.xml



  • Спасибо, так работает. Костыль конечно, но лучше, чем ничего.



  • @Elemental Это не костыль, это особенность работы внутренних языков. При вызове BAS_API процесс ноды уже должен иметь список переменных, которые он будет использовать, он не может их взять с потолка, иначе получилась бы каша. Так что нужно либо в самом экшене Node.js сделать так, как показал @Fox (можно до импорта функции, можно после) либо проинициализировать переменную до кубика ноды, это неважно. Главное дать понять системе, что эту переменную в принципе нужно создать.



  • @Oyasumi-Punpun Я в своей жизни сталкивался с бейсиком, паскалем, делфи, C, C++, PHP, JavaScript, Java и др. и ни в одном языке программирования рабочие переменные функции не нужно было инициализировать за их пределом и тем более, в основном блоке кода, в другом файле, не относящемся ни коим образом к этому модулю. Так что да, это костыль.



  • Тоже столкнулся с этим. И тупо инициализирую их перед инициализацией модуля.
    [[SCR_WIDTH]]=0;
    [[WND_HEIGHT]]=0;
    [[CURRENT_URL]]="";
    Если эти переменные уже инициализированы выше, можно вместо инициализации их в массив загнать. Это тоже работает как вариант костыля, переменные начинают быть видны в модуле.
    let tmp=[ [[SCR_WIDTH]], [[WND_HEIGHT]], [[CURRENT_URL]] ];
    Может это уже где-то писали.



  • Эхх, если бы супер-программисты вроде @Elemental которые видели 100500 языков заглядывали в реализацию (или хотя бы интересовались), могли бы увидеть, что переменные баса во первых != переменным js, а во вторых передаются массивом в качестве параметра ПРИ ВЫЗОВЕ модуля, и, конечно, не будут видны при использовании BAS_API в таком случае. Но как сказал уважаемый ТС, это костыль (хотя это не так), но ему лучше знать.



  • @Dmitry33 по делу - можно устанавливать значения перед require(...) прямо в коде, можно как у вас в примере, с помощью массива. На самом деле главная цель - хоть как-то задать эти переменные, можно даже так, если вам начальное значение не нужно:

    [[TEST1]];
    [[TEST2]];
    ...
    [[TESTN]];
    


  • @Oyasumi-Punpun А чо теперь так можно? +1 Надоело задавать [[]] = ничего=)


Log in to reply