从嵌入数据返回promise时出错

6rqinv9w  于 2022-10-20  发布在  其他
关注(0)|答案(2)|浏览(166)

我正在开发我的第一个Ember应用程序,并通过从model()返回静态JSON对象的路由让它以我想要的方式显示:

element: {
  name: "First Element",
  divisions: [{
    name: "First Division",
    sets: [{name: "Set 1"},{name: "Set 2"},{name: "Set 3"}]
  }, {
    name: "Second Division",
    sets: [{name: "Set 1"},{name: "Set 2"},{name: "Set 3"}]
  }]
}

现在,我正在尝试重构以使用EmberData+Mirage,并度过了一段糟糕的时光。
这是我的路线

export default Ember.Route.extend({
    model() {
        return this.store.find('element', 1);
    },

如果我这样设置幻影m1n2:

this.get('/elements', function() {
    return {
      elements: [
          {
            id: 1,
            name: 'First Element',
            divisions: [1, 2]
          }
      ]
    }
  });

然后我得到这个错误:

Your Ember app tried to GET '/elements/1', but there was no route defined to handle this request.

如果我这样设置幻影m1n1:

this.get('/elements/1', function() {
    return {
       id: 1,
       name: 'First Element',
       divisions: [1, 2]
    }
  });

然后我得到这个错误:

22:46:40.883 "Error while processing route: index" "Assertion Failed: normalizeResponse must return a valid JSON API document:
    * One or more of the following keys must be present: "data", "errors", "meta"." "EmberError@http://localhost:4200/assets/vendor.js:25582:15

编辑:

因此,这并不是解决问题的办法,但它让我度过了难关。我放弃了Pretender,根据这个优秀的教程:http://emberigniter.com/modern-bridge-ember-and-rails-5-with-json-api/,重新开始创建一个真正的Rails服务器
我可以用这种方式做我想做的一切,如果我想把它变成一个制作应用程序,我就更接近了。

zdwk9cvp

zdwk9cvp1#

所以问题是,您实际上没有遵守JSON API规范。你可以通过阅读how to conform上的Mirage页面来解决这个问题。
实际上,在GET /foo/1调用的情况下,您需要在JSON响应的顶层返回一个对象。您还需要将GET /foo的“elements”属性更改为“data”,这样就可以了。目前还没有一种简单的、可重复使用的方法来实现这种开箱即用的幻影。对于这两个问题,现在最好的选择是使用本期中提出的解决方案。

vaj7vani

vaj7vani2#

成员错误normalizeResponse must return a valid JSON API document
可以通过三种方式固定

返回有效的JSONAPI响应

查看错误消息:
normalizeResponse必须返回有效的JSON API文档:

  • 必须存在以下一个或多个键:“data”、“errors”、“meta”。
this.get('/elements/1', function() {
    return {
      data: {
        id: 1,
        name: 'First Element',
        divisions: [1, 2]
      }
    }
  });

另请参见https://jsonapi.org/examples/

规范化所有响应

// app/serializers/application.js

import EmberData from "ember-data";

export default EmberData.JSONAPISerializer.extend({
    normalizeResponse() {
        return {
            data: this._super(...arguments),
        };
    },
    //normalize(){},
    //serialize(){},
    // ...
});

问题:错误处理
通过将所有响应 Package 在{ data: ... }中,它们永远不会返回错误
对于错误,响应应该是

this.get('/elements/1', function() {
    return {
      errors: [
        {
          id: 12345,
          title: 'title for error #12345'
        }
      ]
    }
  });

另请参见https://jsonapi.org/format/#error-对象

用REST替换JSONAPI

sed -i 's/JSONAPISerializer/RESTSerializer/g' app/serializers/*.js
sed -i 's/JSONAPIAdapter/RESTAdapter/g' app/adapters/*.js

成员文档:adaptersserializers
副本:How can ember application be integrated to use with json-server?

相关问题