«Не определено» Исключение при использовании внешнего модуля npm в узле красного с глобальным контекстом - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь использовать модуль npm в нод-красном, после некоторых исследований я столкнулся с использованием глобального контекста и сделал следующее:

  • Добавлен файл require.js в моем каталоге node-red, например:

    functionGlobalContext: { aesjs:require('aes-js'),},

  • Добавлено требование в мой файл red.js require (на всякий случай):

    var aesjs = require('aes-js');

  • Установил модуль aes-js глобально и в директории node_modules узла красного цвета

  • Я бы вызвал модуль в функции узла, вызвав глобальный контекст:

    var aesjs = global.get('aesjs');

Проблема в том, что после выполнения моего потока переменная aesjs не определена, и я получаю следующее сообщение об отладке:

"TypeError: Cannot read property 'ModeOfOperation' of undefined"

Что относится к следующему коду:

var aesjs = global.get('aesjs');
var aesEcb = new aesjs.ModeOfOperation.ecb(key);

В сущности, я опирался на эту запись , но не могу понять, почему переменная не определена, это вопрос асинхронности, если да, то как?

Вот экспорт моего экспериментального потока, просто чтобы убедиться, что не были допущены глупые ошибки:

[{"id":"205673d0.6ffd3c","type":"inject","z":"6affe53a.7dabcc","name":"","topic":"","payload":"{     \"id\": \"474192\" }","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":200,"y":420,"wires":[["f2c2083b.0afae8"]]},{"id":"f2c2083b.0afae8","type":"function","z":"6affe53a.7dabcc","name":"encrypt clientUid","func":"var aesjs = context.global.get('aesjs');\nvar gsm = msg.payload.id; \n\nvar key = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ];\n\nfunction gsmEncode(gsm,key)\n    {\n        var  textBytes=[];\n        \n        for ( i = 0; i < gsm.length; ++i)\n        {\n            var charCode = gsm.charCodeAt(i);\n            textBytes.push(charCode & 0xFF);\n        }\n        \n        return(bytesEncode(textBytes,key));\n    }\n\nfunction bytesEncode(bytes,key)\n    {\n        for ( i = bytes.length;i<16; ++i)\n            bytes.push(0);\n        \n        var aesEcb = new aesjs.ModeOfOperation.ecb(key);\n        var encryptedBytes = aesEcb.encrypt(bytes);\n        \n        return(Buffer.from(encryptedBytes).toString('base64'));\n    \n    }\n\nmsg.payload.encodedId = gsmEncode(gsm,key);\n\nreturn msg; ","outputs":1,"noerr":0,"x":480,"y":420,"wires":[["fab2be23.e888d"]]},{"id":"fab2be23.e888d","type":"debug","z":"6affe53a.7dabcc","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":810,"y":420,"wires":[]}]

1 Ответ

0 голосов
/ 26 июня 2018

Я не вижу ничего особенно неправильного в том, что вы описываете, и я только что проверил, могу ли я получить доступ к модулю aes-js через functionGlobalContext, поэтому в ваших действиях должны быть некоторые недостающие детали.

Вам нужно только установить aes-js в том же каталоге, что и ваш файл settings.js - по умолчанию ~/.node-red/.

Не следует изменять red.js.

Когда запускается Node-REDПроверьте, нет ли сообщений об ошибках в вашем файле настроек.

...