javascript - Ember-Data“错误:断言失败:您为 id 为“当前”的“用户”发出了“findRecord”请求,但适配器的响应没有任何数据”
问题描述
我正在使用 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 但当前与对象上的 ID 不匹配。(但是,当我匹配作为有效端点的 ID 时,我会收到相同的错误)
适配器/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);
}
}
路线/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"
}
}
]
}
任何帮助表示赞赏,谢谢!
解决方案
据我所知,Ember Data 期望 API 返回与用于查找记录具有相同 ID 的记录。如果您正在执行此操作store.findRecord('user', 'current')
,则期望 API 返回具有 ID 的资源'current'
。它不支持您使用它的别名。相反,它会抛出您帖子中提到的断言。
据我所知,这不是JSON:API 规范的限制。该规范与 URL 结构无关。它只设置了一些高级规则:
获取资源
服务器必须支持为每个提供的 URL 获取资源数据:
- 作为顶级链接对象一部分的自链接
- 作为资源级链接对象一部分的自链接
- 作为关系级链接对象一部分的相关链接
据我所知,它不会阻止服务器也从其他 URL 返回资源数据。
该规范包含有关更新资源的 URL 的要求,您应该注意:
更新资源
可以通过向代表资源的 URL 发送 PATCH 请求来更新资源。
可以在资源对象的自链接中获取资源的 URL。或者,当 GET 请求返回单个资源对象作为主要数据时,可以使用相同的请求 URL 进行更新。
删除资源也是如此:
删除资源
可以通过向资源的 URL 发出 DELETE 请求来删除单个资源:
如果您不想支持通过别名创建和删除资源,则必须包含self
该资源的链接。
为了解决 Ember Data 的限制,我建议做一个好的旧请求并使用APIfetch
手动将结果推送到 Ember Data 的存储中。store.pushPayload()
推荐阅读
- c# - C# 窗体关闭并重新打开,抛出“无法访问已处理的对象”
- angular - 使用带有阴影 dom 的角度元素的角度材料
- python - 我只是无法让 displayMousePosition 工作-python
- markdown - 如何在 md 文件中显示此 pypi 下载?
- css - 如何在悬停时在多个帧之间进行图像循环?
- python - 在 Django 中为给定日期添加天数
- python - 使用 shutil 创建 ZIP 文件夹 - Python
- c# - OpenTK - 片段着色器不工作(三角形总是黑色)
- reactjs - 用反应路由器加载香草javascript页面?
- php - 如何只允许每个用户一个会话?