如果您正在寻找来自 API 服务器的关系数据的返回格式,您需要确保以下几点:
- 确保在 ember 模型中定义了关系
- 返回所有成功,状态码为 200
从那里您需要确保正确返回关系数据。如果您已将关系的 ember 模型设置为 {async: true},您只需返回关系模型的 id - 它也应该在 ember.xml 中定义。如果您不设置{async: true},则ember 期望包含所有关系数据。
- 返回具有 JSON API 规范中关系的数据
示例:
models\unicorn.js 在余烬中:
import DS from 'ember-data';
export default DS.Model.extend({
user: DS.belongsTo('user', {async: true}),
staticrace: DS.belongsTo('staticrace',{async: true}),
unicornName: DS.attr('string'),
unicornLevel: DS.attr('number'),
experience: DS.attr('number'),
hatchesAt: DS.attr('number'),
isHatched: DS.attr('boolean'),
raceEndsAt: DS.attr('number'),
isRacing: DS.attr('boolean'),
});
在GET/:id上的api服务器上的routes\unicorns.js:
var jsonObject = {
"data": {
"type": "unicorn",
"id": unicorn.dataValues.id,
"attributes": {
"unicorn-name" : unicorn.dataValues.unicornName,
"unicorn-level" : unicorn.dataValues.unicornLevel,
"experience" : unicorn.dataValues.experience,
"hatches-at" : unicorn.dataValues.hatchesAt,
"is-hatched" : unicorn.dataValues.isHatched,
"raceEndsAt" : unicorn.dataValues.raceEndsAt,
"isRacing" : unicorn.dataValues.isRacing
},
"relationships": {
"staticrace": {
"data": {"type": "staticrace", "id" : unicorn.dataValues.staticRaceId}
},
"user":{
"data": {"type": "user", "id" : unicorn.dataValues.userId}
}
}
}
}
res.status(200).json(jsonObject);
在 ember 中,您可以通过链接模型函数来调用它。例如当这只独角兽去controllers\unicornracer.js比赛时:
raceUnicorn() {
if (this.get('unicornId') === '') {return false}
else {
return this.store.findRecord('unicorn', this.get('unicornId', { backgroundReload: false})).then(unicorn => {
return this.store.findRecord('staticrace', this.get('raceId')).then(staticrace => {
if (unicorn.getProperties('unicornLevel').unicornLevel >= staticrace.getProperties('raceMinimumLevel').raceMinimumLevel) {
unicorn.set('isRacing', true);
unicorn.set('staticrace', staticrace);
unicorn.set('raceEndsAt', Math.floor(Date.now()/1000) + staticrace.get('duration'))
this.set('unicornId', '');
return unicorn.save();
}
else {return false;}
});
});
}
}
以上代码发送PATCH到api服务器路由unicorns/:id
关于GET,POST,DELETE,PATCH的最后说明:
GET 假设您正在获取与模型相关的所有信息(上面的示例显示了GET 响应)。这与 model.findRecord (GET/:id)(需要一条记录)、model.findAll(GET/)(需要一个记录数组)、model.query(GET/?query=&string=)(需要一个数组)相关联记录),model.queryRecord(GET/?query=&string=)(需要一条记录)
POST 假设您至少将 POST 从 ember 返回到 api 服务器,但也可以返回您在 apiServer 端创建的其他信息,例如 createdAt 日期。如果返回的数据与您用于创建模型的数据不同,它将使用返回的信息更新创建的模型。这与 model.createRecord(POST/)(需要一条记录)相关联。
DELETE 假设您返回类型和已删除对象的 id,而不是数据或关系。这与 model.deleteRecord(DELETE/:id)(期望一条记录)相关联。
PATCH 假设您至少返回了更改的信息。如果您只更改一个字段,例如在我的 unicorn 模型中,unicornName,它只会修补以下内容:
{
data: {
"type":"unicorn",
"id": req.params.id,
"attributes": {
"unicorn-name" : "This is a new name!"
}
}
}
所以它只期望至少返回的响应,但是像POST,你可以返回其他更改的项目!
我希望这能回答您关于 JSON API 适配器的问题。大部分信息最初是通过阅读 http://jsonapi.org/format/ 的规范和 https://emberjs.com/api/data/classes/DS.JSONAPIAdapter.html 的 ember 实现文档获得的