如何在node.js中使用module.exports导出多个功能

时间:2019-02-25 22:25:05

标签: node.js ecmascript-6

我正在创建一个实用程序类来处理一些常见功能,以帮助减少模块中的代码复制/粘贴:我创建了一个导出模块。这里发生的一切就是导出包含三个函数的对象。

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 :(得分:3)

MDN Web文档对您在JSON.strigify()中所看到的行为进行了解释:

  

如果未定义,在转换过程中遇到函数或符号,则将其省略(在对象中找到)或将其检查为空(在数组中找到)。

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

编辑:为澄清起见,我认为您正在正确导出实用程序函数,但是JSON.stringify()明确承诺不打印函数。

答案 1 :(得分:0)

JSON.stringify不对函数进行序列化,如果需要这样做,则必须使用类似https://github.com/braceslab/json-stringify-extended

的自定义字符串化函数

所以,运行

console.log(ut)

将打印

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

此外,您可以从函数中删除asyncawait,使用return new Promise

则无用