2016-11-16 70 views
0

我是新來的JavaScript和節點,並且無法從貓鼬查詢將結果返回給我可以使用的對象。我的應用程序當前正在將發佈請求的主體分析到緩存中,使用緩存對象(mlcRecord.existFixture)中的字段查詢數據庫,並返回一個抓取其他屬性的對象。這部分代碼工作正常。但是,額外的屬性在.then範圍之外是未定義的。貓鼬查詢的結果在父範圍中不可用

我敢肯定我缺少一些基本的東西,所以任何指導人員可以提供讚賞。

router.route('/mlc') 
.post(function (req,res){ 
    var mlcRecord = new mlcInputObj(req.body); 
    async.series([ 
     function (callback) { 
     function setWattages(mlcRecord) { 

     // load the existFixture TechnologyID 
     ltgTechnologies.findOne({TechnologyID: mlcRecord.existFixture}).exec() 

     // capture the technologyID 
      .then(function(ltgTechnology){ 
       mlcRecord.existFixtureWatts = ltgTechnology.SystemWatts; 
       return mlcRecord; 
      }); 
     } 

     setWattages(mlcRecord); 

     console.log('mlcRecord: ', mlcRecord); // existFixtureWatts displays as undefined 
     callback(); 
    } 
    ], function (err) { 
    res.json(mlcRecord); 
    }); 
}); 
+0

可你把整個文件從你的問題? – num8er

回答

1

您的代碼過於複雜。

async.series不適合您的目的。

這裏是修復:

router 
    .route('/mlc') 
    .post(function (req,res){ 
    var mlcRecord = new mlcInputObj(req.body); 

    // load the existFixture TechnologyID 
    ltgTechnologies 
     .findOne({TechnologyID: mlcRecord.existFixture}) 
     .exec(function(err, result) { 
     mlcRecord.existFixtureWatts = null; 
     if(result) { 
      mlcRecord.existFixtureWatts = result.SystemWatts; 
     } 
     res.send(mlcRecord); 
     }); 
    }); 

,但如果你想mlcRecord保存到數據庫:

router 
    .route('/mlc') 
    .post(function (req,res){ 

    var mlcRecord = new mlcInputObj(req.body); // creating mlcRecord instance 

    mlcRecord.save(function(err) { // inserting to database 
     if(err) return res.status(500).send({err}); 

     // adding to mlcRecord existFixtureWatts 
     ltgTechnologies 
     .findOne({TechnologyID: mlcRecord.existFixture}) 
     .exec(function(err, result) { 
      mlcRecord.existFixtureWatts = null; 
      if(result) { 
      mlcRecord.existFixtureWatts = result.SystemWatts; 
      } 
      res.send(mlcRecord); 
     }); 
    }); 

    }); 
+0

謝謝@ num8er。在測試您的解決方案後,我發現它不適用於我的目的。當我構建基於mlcRecord的數據管道時,實際上我需要async.waterfall。事實證明,我遇到的問題與.execution上下文有關。對於任何對此問題感興趣的人,我已將我的解決方案作爲下面的評論。 – tpick

0

我不能確定到底是什麼問題是與執行上下文,但似乎在承諾之外,ltgTechnologies.findOne返回的承諾中的mlcRecord無法訪問。立即在setWattages函數中返回承諾,然後綁定合成的承諾,解決了我的問題。我也重新命名了幾個字段並移動到一個模塊中。下面的代碼。

app.js

// some code ... 
router 
.route('/mlc') 
.post(function (req,res){ 

var mlcRecord = new mlcInputObj(req.body); 

async.waterfall([ 

    function (callback) { 
     mlcRecord.setOccSensorScenario(); 
     mlcRecord.setltgTechnologyVals().then(function(){ 
      callback(null); 
     }); 
    }, 
    // more functions to execute sequentially 

], function (err, result) { 
    res.json(mlcRecord); 
}); 
}); 
// some other code ... 

mlcInputObj.js(構造函數)

// constructor 
// ... 
// constructor methods 

mlcInputObj.prototype.setltgTechnologyVals = function() { 
//alias for 'this' used in bind 
var mlcObj = this; 

// load the existFixture TechnologyID 
return Promise.all([ 
    // query ltgTechnologies and set existFixtureWatts 
    ltgTechnologies.findOne({TechnologyID: this.existFixture}).exec() 
    .then((function(fixture){ 
     this.existFixtureWatts = fixture.SystemWatts; 
    }).bind(mlcObj)), 
    // another promise, 
    // last promise 
]}; 
}