【问题标题】:node module.export and recursion节点模块.导出和递归
【发布时间】:2020-07-28 04:06:59
【问题描述】:

我正在开发一个节点应用程序,它本质上是一个简单的 AWS SQS 轮询器,应该坐下来监听不同队列中的新项目。

这是我的module.export

module.exports = {
    readMessage: function(qParams, qType, tableName) {
        logger.debug(qType);

        SQS.receiveMessage(qParams, handleSqsResponse);

        function handleSqsResponse (err, data) {
            if(err) logger.error("handleSqsResponse error:" + err);
            if (data && data.Messages) {
                data.Messages.forEach(processMessage)
                readMessage(); // continue reading until draining the queue (or UPTIME reached)
            }
            else{
                logger.debug("no data in sqs.");
                // process.exit();
            }
        }

        // 'processing' is mainly writing to logs using winston. Could add here any transformations and transmission to remote systems
        function processMessage(sqsMessage){
            // Parse sqs messag
            var msgObj = JSON.parse(sqsMessage.Body);

            // Process
            logger.info(msgObj.Message);

            _.extend(qParams, { "ReceiptHandle": sqsMessage.ReceiptHandle });

            dbMap[qType](msgObj, qParams, tableName);
        }
    }
}

我遇到的问题是当我再次尝试拨打readMessage(); 时。我收到ReferenceError: readMessage is not defined的错误

【问题讨论】:

    标签: node.js


    【解决方案1】:

    module.exports 是一个普通对象,它暴露给具有readMessage 方法的外部模块。 readMessage() 应该是 module.exports.readMessage()

    我还建议创建一个变量,然后将其导出:

    var obj = {
        readMessage: function(qParams, qType, tableName) {
            logger.debug(qType);
    
            SQS.receiveMessage(qParams, handleSqsResponse);
    
            function handleSqsResponse (err, data) {
                if(err) logger.error("handleSqsResponse error:" + err);
                if (data && data.Messages) {
                    data.Messages.forEach(processMessage)
                    obj.readMessage(); // continue reading until draining the queue (or UPTIME reached)
                }
                else{
                    logger.debug("no data in sqs.");
                    // process.exit();
                }
            }
    
            // 'processing' is mainly writing to logs using winston. Could add here any transformations and transmission to remote systems
            function processMessage(sqsMessage){
                // Parse sqs messag
                var msgObj = JSON.parse(sqsMessage.Body);
    
                // Process
                logger.info(msgObj.Message);
    
                _.extend(qParams, { "ReceiptHandle": sqsMessage.ReceiptHandle });
    
                dbMap[qType](msgObj, qParams, tableName);
            }
        }
    }
    
    module.exports = obj;
    

    请注意,我只回答了您特别提出的问题。我没有考虑与代码相关的任何架构问题。

    【讨论】:

    • 啊,明白了。那讲得通!然后我可以只传递最初传递给 readMessage() 方法的相同变量吗?
    • 没错...您可能想为此添加一个计时器,但我想这取决于数据预期更改的频率
    • 非常感谢!!你为我节省了很多时间!
    【解决方案2】:
    function functionName(has = false){
      var total = 0;
      if(has){
        functionName(true)
      } else {
        // Todo
      }
    }
    
    module.exports.functionName = functionName;
    

    【讨论】:

    • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
    猜你喜欢
    • 2014-11-04
    • 2021-08-15
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2019-11-03
    • 2016-12-18
    • 2016-03-06
    • 1970-01-01
    相关资源
    最近更新 更多