2014-01-28 28 views
2

剛學ember.js,並開始構建應用程序與ember-app-kit燼-APP-套件 - 磕碰與數據的API從外部文件

我使用的是提供的API存根存根出的API,但我還是決定在外部JSON文件改爲「固定數據」來使用。這個決定的原因 - 我將使用相同的json文件來測試我的燼寶應用以及rails api後端。 Here's以我的json文件爲例。

所以我api-stub/routes.js目前看起來是這樣的:

工作實現

var path = require('path'); 
var fs = require('fs'); 
// going to sibling directory 
var fixtureDir = path.resolve(__dirname, '../..', 'lightfixtures') 

module.exports = function (server) { 

    // Create an API namespace, so that the root does not 
    // have to be repeated for each end point. 
    server.namespace('/api', function() { 

     var locationsProtocol = JSON.parse(fs.readFileSync(fixtureDir + '/locations.json')); 
     var roomsProtocol = JSON.parse(fs.readFileSync(fixtureDir + '/rooms.json')); 

     // stub location list request 
     server.get(locationsProtocol[0].request.url, function (req, res) { 
     res.send(locationsProtocol[0].response.data); 
     }); 

     // stub individual location request 
     server.get(locationsProtocol[1].request.url, function (req, res) { 
     res.send(locationsProtocol[1].response.data); 
     }); 

     // stub room list request 
     server.get(roomsProtocol[0].request.url, function (req, res) { 
     res.send(roomsProtocol[0].response.data); 
     }); 

     // stub individual room request 
     server.get(roomsProtocol[1].request.url, function (req, res) { 
     res.send(roomsProtocol[1].response.data); 
     }); 
    }); 
    }; 

所以,在閱讀文件,並解析它的零部件磕碰適當請求,工作正常 - 但看起來非常多餘。我想遍歷解析的JSON和生成stub的所有元素,擦乾,並可以很容易地添加更多的存根,這樣的事情:

期望的實施

... 
var locationsProtocol = JSON.parse(fs.readFileSync(fixtureDir + '/locations.json')); 
var roomsProtocol =  JSON.parse(fs.readFileSync(fixtureDir + '/rooms.json')); 

function respondToEach(json) { 
    for (var i = 0; i < json.length; i++) { 
    server.get(json[i].request.url, function (req, res) { 
     res.send(json[i].response.data); 
    }); 
    } 
} 

respondToEach(locationsProtocol); 
respondToEach(roomsProtocol); 
... 

但它失敗!灰燼拋出一個默認的錯誤,並在網絡窗格中聲稱,它得到一個內部服務器錯誤(500),和響應節說「類型錯誤:無法讀取未定義的屬性‘響應’」(指示線是這個 - res.send(json[i].response.data);

我很困惑 - 我想工作的實施和「理想」的實現應該產生完全相同的輸出 - 但它不是這樣的人可以幫我瞭解在哪裏我失敗(即重構版本的區別了),也許。我怎麼可以解決這個問題?

回答

2

你正在進入臭名昭着的JavaScript循環封閉問題:)每個匿名函數i內將最終成爲lengthjson評估時。

像這樣的東西應該工作

function respondToEach(json) { 
    for (var i = 0; i < json.length; i++) { 
    (function(idx){ 
     server.get(json[idx].request.url, function (req, res) { 
     res.send(json[idx].response.data); 
     }); 
    })(i); 
    } 
} 

,或者你可以定義另一個函數,這將解決關閉問題

function realResponse(item){ 
    server.get(item.request.url, function (req, res) { 
    res.send(item.response.data); 
    }); 
} 

function respondToEach(json) { 
    for (var i = 0; i < json.length; i++) { 
    realResponse(json[i]); 
    } 
} 
+0

謝謝謝謝謝謝!我今天學到了東西。 :) – apprenticeDev