Ember destroyRecord(或deleteRecord然后保存)使用ember-cli-mirage失败

时间:2015-10-13 05:25:14

标签: javascript ember.js ember-data ember-cli ember-cli-mirage

我尝试做的是将ember-cli-mirage整合到这个待办事项应用https://github.com/ember-cli/ember-cli-todos中。此应用程序使用Ember 2.0或更高版本。设置:

  1. 克隆todo应用,然后进入app目录。
  2. 壳> npm install
  3. 壳>凉亭安装
  4. 壳> ember serve
  5. 我确认应用程序正在宣传(除了一个与此无关的小问题)。我可以创建,更新和删除待办事项。 todo应用程序使用ember-data-fixture-adapter / FIXTURES为应用程序提供数据。

    我整合ember-cli-mirage的步骤是:

    1. 注释app / models / todo.js中的Todo.reopenClass块(创建FIXTURES /种子数据的代码)。
    2. 删除了app / adapters目录(只包含一个文件,application.js(只包含一行,"导出{默认}来自' ember-data-fixture-adapter&#39 ;; &#34))。我非常确定整个目录只适用于FIXTURES设置。
    3. 壳> ember install ember-cli-mirage
    4. 根据http://www.ember-cli-mirage.com/docs/v0.1.x/working-with-json-api/的说明设置ember-cli-mirage部件(app / mirage / {config.js,factories / post.js,scenarios / default.js})。
    5. 我发布app / mirage / {config.js,factories / post.js,scenarios / default.js}的代码,如果有人需要看到它,但它基本上只是一个副本ember-cli-mirage页面中的说明("用户"型号名称替换为"帖子")。

      我重启了ember服务器。除了删除待办事项外,一切正常。通过按下" x"来完成记录删除。将指针移动到待办事项右侧时将出现的按钮。我发现它在删除记录的save()部分失败了。删除记录的代码(使用" x"按钮界面)位于app / components / todo-item / component.js中,它看起来像这样:

      removeTodo() {
        var todo = this.get('todo');
      
        todo.deleteRecord();
        todo.save();
      }
      

      当我尝试删除待办事项时,浏览器控制台会打印"成功请求:DELETE / todos / n" (" n"是todo id),然后它会打印出一个神秘的错误消息以及堆栈跟踪。

      我评论了" todo.save();"上面的一行。当我删除了待办事项时,移除仍然失败,但在控制台上,在"成功请求之后不再出现错误消息:DELETE / todos / n"消息。

      所以我更改了上面的removeTodo代码,试图让错误消息更加清晰。我改成了这个:

      todo.save().then(function() {
          console.log('Save OK.');
        }).catch((err) => {
          console.log('Save failed.');
          console.log(err.message);
      });
      

      我已尝试对此处的各种更改,但始终出现的错误消息是:

        

      断言失败:适配器无法为已具有id的记录分配新ID。有id:3,你试图用undefined更新它。这可能是因为您的服务器返回的数据是为了响应与您发送的ID不同的查找或更新。

      我看到一条错误消息,其中包含" normalizeserializer ..."上面的文字,但我忘了复制整个信息。

      我添加了一个适配器:

      shell> ember g adapter application
      
      // app/adapters/application.js
      import DS from 'ember-data';
      
      export default DS.JSONAPIAdapter.extend({
      });
      

      但这并没有解决它。

      BTW,一个todo项目创建,也可以调用todo项目的保存,有效。代码位于app / components / todos-route / component.js:

      createTodo() {
        const store = this.get('store');
      
        // Get the todo title set by the "New Todo" text field
        var title = this.get('newTitle');
      
        if (title && !title.trim()) {
          this.set('newTitle', '');
          return;
        }
      
        // Create the new Todo model
        var todo = store.createRecord('todo', {
          title: title
        });
      
        // Clear the "New Todo" text field
        this.set('newTitle', '');
      
        // Save the new model
        todo.save();
      }
      

1 个答案:

答案 0 :(得分:4)

你的Mirage模仿DELETE/todos/:id的样子是什么样的?看起来您正在使用包含id的JSON有效内容来响应DELETE请求,这会导致问题。

相反,你可以尝试一些返回空响应体的东西,比如

this.del('/todos/:id', (db, request) => {
  let id = request.params.id;
  db.todos.remove(id);

  return new Mirage.Response(204, {}, {});
});

(此代码未经测试,但希望您明白这一点。)

另一个小问题是,模型上有一个destroyRecord方法,基本上可以同时执行deleteRecordsave