Ember.js primaryKey:'_id'?

有一个明显的可能是我放弃了这个。 当然,这并不能帮助我尝试几乎同时学习所有这些技术。 我使用Node.js / Express / Mongoose / MongoDB构build了一个API,它可以工作。 我试图在Ember.js应用程序中使用这个REST端点。 Ember应用程序与夹具一起工作,所以客户端正在工作。

问题是REST端点正在发射对象id为_id ,Ember期望并需要id 。 是的,我已经search了一个相关的问题 ,并尝试了解决scheme:

 WbsEmber.ApplicationAdapter = DS.RESTAdapter.extend({ serializer: DS.RESTSerializer.extend({ primaryKey: function(type){ return '_id'; } }), host: 'http://localhost:8080', namespace: 'api' }); 

阅读RESTAdapter的Ember.DS api文档 ,看来这应该工作:

 WbsEmber.ApplicationSerializer = DS.RESTSerializer.extend({ primaryKey: '_id' }); WbsEmber.ApplicationAdapter = DS.RESTAdapter.extend({ host: 'http://localhost:8080', namespace: 'api' }); 

但是,两者都继续在控制台中扔这个错误堆栈。

 Error while loading route: Error: No model was found for '0' at new Error (native) at Error.Ember.Error (http://localhost:9000/bower_components/ember/ember.js:910:19) at Ember.Object.extend.modelFor (http://localhost:9000/bower_components/ember-data/ember-data.js:9805:33) at JSONSerializer.extend.extractArray (http://localhost:9000/bower_components/ember-data/ember-data.js:3172:28) at superWrapper (http://localhost:9000/bower_components/ember/ember.js:1292:16) at Ember.Object.extend.extractFindAll (http://localhost:9000/bower_components/ember-data/ember-data.js:2380:21) at Ember.Object.extend.extract (http://localhost:9000/bower_components/ember-data/ember-data.js:2365:37) at http://localhost:9000/bower_components/ember-data/ember-data.js:10396:34 at invokeCallback (http://localhost:9000/bower_components/ember/ember.js:10013:19) at publish (http://localhost:9000/bower_components/ember/ember.js:9683:9) 

只是为了比较,我的夹具看起来像下面这样:

 WbsEmber.Code.FIXTURES = [ { id: 0, wbs: 'C04220', name: 'AGSS', type: 'prefix' }, { id: 1, wbs: 'E5180', name: "ILO", type: 'suffix' }, { id: 2, wbs: 'C04210', name: 'ARC1', type: 'prefix' }, { id: 3, wbs: 'E0040', name: ' course preparation', type: 'suffix' }, { id: 4, wbs: 'C04232', name: 'ARC2', type: 'prefix' }, { id: 5, wbs: 'E0041', name: 'learn new course', type: 'suffix' }, { id: 6, wbs: '4710', name: 'instructor labor', type: 'single' }, { id: 7, wbs: 'ES1028', name: 'tech lead labor', type: 'single' } ]; 

来自REST端点的JSON响应如下所示:

 [ {"_id": "53ac3f0d4e29d793d9f53384", "type": "prefix", "name": "UAGI", "wbs": "C04424", "__v": 0}, {"_id": "53ac3f114e29d793d9f53385", "type": "prefix", "name": "AGSS", "wbs": "C04220", "__v": 0}, {"_id": "53ac3f154e29d793d9f53386", "type": "prefix", "name": "ARC1", "wbs": "C04210", "__v": 0}, {"_id": "53ac3f184e29d793d9f53387", "type": "prefix", "name": "ARC2", "wbs": "C04232", "__v": 0} ] 

该响应直接从Chrome中的开发人员工具进行复制和粘贴,以便成功完成请求,并将响应发送给客户端。

仅供参考,以下是所有的软件包和相应的版本。

 "dependencies": { "ember": "1.5.0", "handlebars": "1.2.1", "ember-data": "1.0.0-beta.7", "bootstrap-sass-official": "3.1.1", "ember-addons.bs_for_ember": "~0.7.0" } 

我似乎无法想象,为了我的生活,弄清楚如何做到这一点。 任何build议,见解或引用来源可能解决这个问题是受欢迎的。 感谢您的帮助。

这是正确的模式:

 WbsEmber.ApplicationSerializer = DS.RESTSerializer.extend({ primaryKey: '_id' }); WbsEmber.ApplicationAdapter = DS.RESTAdapter.extend({ host: 'http://localhost:8080', namespace: 'api' }); 

你的json响应应该是(或被序列化)成这种格式:

 { codes: [ {"_id": "53ac3f0d4e29d793d9f53384", "type": "prefix", "name": "UAGI", "wbs": "C04424", "__v": 0}, {"_id": "53ac3f114e29d793d9f53385", "type": "prefix", "name": "AGSS", "wbs": "C04220", "__v": 0}, {"_id": "53ac3f154e29d793d9f53386", "type": "prefix", "name": "ARC1", "wbs": "C04210", "__v": 0}, {"_id": "53ac3f184e29d793d9f53387", "type": "prefix", "name": "ARC2", "wbs": "C04232", "__v": 0} ] } 

转换文档对于仍在运行的文档中的一些细微差别确实有帮助: https : //github.com/emberjs/data/blob/master/TRANSITION.md