我正在使用Ember 3.17并尝试设置Ember Data以使用JSONAPIAdapter进行服务器调用,但我一直收到此错误:Error: Assertion Failed: You made a 'findRecord' request for a 'user' with id 'current', but the adapter's response did not have any data
我的适配器是否有问题?
下面找到我的适配器、路由和这个调用的预期数据(我已经设置了一个模型,只有一个属性)。唯一有点奇怪的是我的端点是/users/current,但是current与对象上的ID不匹配。(但是当我匹配ID时,这是一个有效的端点,我得到了同样的错误)
adapters/application.js
import JSONAPIAdapter from '@ember-data/adapter/json-api';
import ENV from 'rendia-tv-web/config/environment';
export default class ApplicationAdapter extends JSONAPIAdapter {
host = ENV.APP.API_HOST;
namespace = 'tv/v1';
headers = {
'Authorization': <authHeader>,
};
ajax = function(url, method, hash) {
hash.crossDomain = true;
hash.xhrFields = {withCredentials: true};
return this._super(url, method, hash);
}
}
routes/application.js
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
export default class ApplicationRoute extends Route {
@service store;
async model() {
return this.store.findRecord('user', 'current');
}
}
期望数据
{
"data": {
"id": "12345",
"type": "users",
"attributes": {
"username": "email@email.com",
"name": "User 1"
},
"relationships": {
"practice": {
"data": {
"type": "practice",
"id": "55555"
}
}
}
},
"included": [
{
"type": "practice",
"id": "55555",
"attributes": {
"date_created": "2016-09-23T04:21:38-04:00",
"name": "Practice Name",
"expiration_date": "2024-10-23T23:59:59-04:00"
}
}
]
}
任何帮助都是感激不尽的,谢谢!
1条答案
按热度按时间blpfk2vs1#
据我所知,Ember Data期望API返回一个与用于查找记录的ID相同的记录。如果您正在执行
store.findRecord('user', 'current')
,它期望API返回一个ID为'current'
的资源。它不支持您正在使用的别名。相反,它将抛出您发布中提到的Assert。据我所知,这 * 不是 * JSON:API规范的限制。该规范对URL结构是不可知的。它只设置了一些高级规则:
正在获取资源
服务器必须支持为每个URL获取资源数据,如下所示:
https://jsonapi.org/format/#fetching-resources
据我所知,它并没有阻止服务器从其他URL返回资源数据。
该规范包含有关用于更新资源的URL的要求,您应该了解这一点:
更新资源
可以通过向表示资源的URL发送PATCH请求来更新资源。
可以在资源对象的自链接中获取资源的URL。或者,当GET请求返回单个资源对象作为主要数据时,可以使用相同的请求URL进行更新。
https://jsonapi.org/format/#crud-updating
删除资源也是如此:
删除资源
可以通过向资源的URL发出DELETE请求来删除单个资源:
https://jsonapi.org/format/#crud-deleting
如果您不想支持通过别名创建和删除资源,则 * 必须 * 包含资源的
self
链接。为了解决Ember Data的限制,我建议使用
store.pushPayload()
API手动执行一个旧的fetch
请求并将结果推送到Ember Data的存储中。