2014-10-23 2 views
3

Я работаю над узловым приложением, которое по сути является простым опросчиком AWS SQS, который должен сидеть и слушать новые предметы в разных очередях.node module.export и recursion

Вот мой 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

ответ

6

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; 

Пожалуйста, обратите внимание, что я ответил только на вопрос, вы специально просили. Я не принимал во внимание какую-либо архитектурную проблему, связанную с кодом.

+0

Ah, gotcha. В этом есть смысл! И тогда я мог бы просто передать те же переменные, которые первоначально были переданы методу 'readMessage()'? – dennismonsewicz

+0

Правильно ... Возможно, вы захотите добавить к нему таймер, но я думаю, это зависит от того, как часто данные будут меняться. – Maroshii

+0

Большое спасибо! Вы спасли меня много времени! – dennismonsewicz