Как экспортировать несколько функций, используя module.exports в node.js - PullRequest
0 голосов
/ 26 февраля 2019

Я создаю класс утилит для обработки некоторых из наших общих функций, которые помогают уменьшить количество копий / вставок кода в наших модулях: я создал модуль экспорта.Все, что здесь происходит, это экспорт объекта, который содержит три функции.

module.exports = { 
    //retrieve a secret object from the AWS Secrets Manager
    //Parameter should be string value of the Secret ID

     getSecretIdAsync : async (param) => {
        return await new Promise((resolve, reject) => {
            scrtmgr.getSecretValue({SecretId: param}, (err, data) => {
                if(err){ 
                    reject(console.log('Error getting SecretId: ' + err, err.stack)); 
                } else{
                    if('SecretString' in data)
                    return resolve(JSON.parse(data.SecretString));
                }
             });
        });
    },

    //retrieves the AWS Paramter value from the AWS Paramter store
    //param should be string value of parameter hierarchical id

    getParameterValueFromStoreAsync : async (param) => {
        return await new Promise((resolve, reject) => {
            servmgr.getParameter({ Name: param}, (err, data) => {
                if(err){
                    reject(console.log('Error getting parameter: ' + err, err.stack));
                } 
                return resolve(data.Parameters.Value);
            });
        });
    },

    //retrieves the AWS Paramter "object" from the AWS Paramter store
    //param should be string value of parameter hierarchical id

    getParameterFromStoreAsync : async (param) => {
        return await new Promise((resolve, reject) => {
            servmgr.getParameter({ Name: param}, (err, data) => {
                if(err){
                    reject(console.log('Error getting parameter: ' + err, err.stack));
                } 
                return resolve(data.Parameters);
            });
        });
    }
}

Всякий раз, когда я пытаюсь ссылаться на этот модуль (скажем, в моем модульном тесте я ссылаюсь на модуль как:

let chai = require('chai');
let ut = require('../utilities.js');
let expect = chai.expect;
let aws = require('aws-sdk-mock');


describe('get parameter value', ()=>{

    it('resolves', (done)=>{
        var result = aws.mock('SSM', 'putParameter' , {"Name": "someName", "Value": "someValue"} );
        console.log('###### ' + JSON.stringify(ut));

        //console.log(obj);
    });
});

Структура каталогов: utilities.js находится в корне, где модульный тест находится в папке с именем test.

Всякий раз, когда я пытаюсь импортировать модуль утилит, объект всегда пуст. console.log('###### ' + JSON.stringify(ut)); генерирует ###### {}

В прошлом я экспортировал отдельные функции, и я подумал, что группа функций просто потребует экспорта конструктора.

Должно ли несколько функций экспортироваться различным образом?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

JSON.stringify не сериализует функции, если вам нужно сделать это, вы должны использовать пользовательскую функцию stringify, как это https://github.com/braceslab/json-stringify-extended

, поэтому запуск

console.log(ut)

будетprint

{ getSecretIdAsync: [AsyncFunction: getSecretIdAsync],
  getParameterValueFromStoreAsync: [AsyncFunction: getParameterValueFromStoreAsync],
  getParameterFromStoreAsync: [AsyncFunction: getParameterFromStoreAsync] }

также вы можете удалить async и await из ваших функций, бесполезно используя return new Promise

0 голосов
/ 26 февраля 2019

MDN Web Docs предлагает объяснение поведения, которое вы видите с JSON.strigify():

Если не определено, функция или символ встречаются во время преобразования, они либо опускаются (когдаон найден в объекте) или подвергнут цензуре на ноль (когда он найден в массиве).

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

edit: Чтобы уточнить, я думаю, вы экспортируете свои служебные функции правильно, но JSON.stringify() явно обещает не печатать функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...