2014-01-28 4 views
2

그냥 ember.js를 배우고 ember-app-kit으로 앱을 만들기 시작했습니다.ember-app-kit - 외부 파일의 데이터로 API 스텁하기

제공된 API 스텁을 사용하여 API를 스텁 처리하고 있지만 외부 json 파일을 "고정물 데이터"로 사용하기로했습니다. 이 결정의 이유 - 필자는 동일한 json 파일을 사용하여 엠버 응용 프로그램과 레일 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을 반복하고 생성 할 수 싶습니다

를 원함 이행

... 
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); 
... 

을하지만 실패 ! Ember가 기본 오류를 발생시키고 네트워크 창에서 내부 서버 오류 (500)를 발생시키고 응답 섹션에 "TypeError : 정의되지 않은 속성 '응답'을 읽을 수 없음 (이 표시된 행은이 경우입니다.) - res.send(json[i].response.data);

나는 혼란 스럽다 - 구현과 "원하는"구현이 정확히 같은 출력을 내야한다고 생각하지만, 그렇지 않다. 누군가가 내가 을 이해할 수 있도록 도와 줄 수 있는가? (예 : 리팩터링 된 버전이 어떻게 다른지) 문제를 어떻게 해결할 수 있습니까?

답변

2

악명 높은 자바 스크립트 루프 클로저 문제로 실행 중입니다. 각 익명 함수 내에서 ilength으로 끝납니다. 평가시 json 이 같은

뭔가

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