2015-07-11 52 views
0

我想運行Forever的後臺進程,每小時將數據從外部服務添加到我的MongoDB數據庫(我是新的節點,並不知道如何做到這一點)。我正在使用節點與Express並運行使用Mongoose回調不工作使用Forever

forever -o out.log -e err.log start background/collector.js 

所以我有一些來自過程的反饋。代碼如下:

var request = require('request'); 
var mongoose = require('mongoose'); 
var Model = require('../models/Model.js'); 

// Starting the collector process 
addNewData(); 

function addNewData() { 
    request('external_service_url', function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
      var models = JSON.parse(body); 

      console.log('Adding the new models...') 
      for(var i = 0; i < models.length; i++) 
      { 
       console.log(i); 

       Model.create(models[i], function (error, post, result) { 
        console.log('Test'); 
        if (error) console.log('Something went wrong adding the document!'); 
        if (! result.updatedExisting) 
        { 
         console.log('A new document has been added!'); 
        } 
       }); 
      } 

      console.log('Models added: ' + models.length); 

      // Every hour we will collect new data 

      console.log('Waiting for an hour...'); 
      setTimeout(addNewData, 36000000); 
     } 
    }) 
} 

我不知道爲什麼,但似乎.create()回調不工作,放在創建回調裏面的console.logs未顯示在日誌中任何東西。永遠不與貓鼬一起工作?你有什麼想法嗎?

回答

0

嗯,這是事情。您從未將您的貓鼬適配器「連接」到數據庫。只需通過添加:

mongoose.connect('mongodb://myhost/mydatabase'); 

某處靠近頂部,然後再嘗試做其他任何事情。它不一定按照這個順序「連接」,但是貓鼬方法可以解決這個問題。 「異步編程」,繼續閱讀。

此外,你不應該等待循環,因爲你不等待「回調」(它不是一個閉包它是一個回調)來完成或以其他方式「扼殺」連接,這可能會導致問題。

改爲使用類似"async"的東西來處理此問題。在這個例子中.eachLimit()以並行操作的數量限制爲一個reasonabe水平:

async.eachLimit(models,10,function(el,callback) { 
    Model.create(models[i], function (error, result) { 
     // do something maybe but call 
     callback(err); // to signal it is done 
    }); 
},function(err) { 
    // comes here on completion or error 
}); 

記住,「臺異步」代碼需要的「回調」或「用」執行,以便當事情對信號完成。在「scynchronous」編程中取消勾選,其中每個下一行僅在前面的代碼行完成時才執行。

您的「for」循環只是「將所有內容」發送到服務器,並且在繼續執行之前不等待完成。

但這裏的主要問題是連接。但你仍然應該如圖所示修復其餘部分。

+0

哦,你是對的,我在我的app.js文件中連接到mongodb,但是這個腳本與app.js文件無關。似乎現在正在工作。你是對的,我的意思是迴音對不起,我總是混淆兩個詞!我知道我不是同步創建文檔,但我不介意在這種情況下,似乎工作正常。非常感謝! – miquelarranz

+0

@miquelarranz是的。在'app.js'或其他「主模塊代碼」中連接是長時間運行的應用程序的標準。但這個「腳本」當然是stanalone,所以你需要在那裏做。這裏的其他建議是你真的需要遵循的,以免你將來遇到問題。 –

+0

是的,我欣賞的意見:)我測試知道腳本,似乎setTimeout不工作,腳本不斷添加新的文件。也許它與一切異步工作的事實有關?任何想法? – miquelarranz