Ember-Data“错误:Assert失败:您为ID为'current'的'user'发出了'findRecord'请求,但适配器的响应中没有任何数据”

ekqde3dh  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(136)

我正在使用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"
            }
        }
    ]
}

任何帮助都是感激不尽的,谢谢!

blpfk2vs

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的存储中。

相关问题