Ember 2.18如何将PATCH更新请求转为PUT适配Sails后端?
解决Ember 2.18 JSONAPIAdapter无法将PATCH转为PUT的问题
看起来你踩了一个版本兼容的坑——Ember Data 2.18的JSONAPIAdapter并没有methodForRequest这个方法,这就是你定义的这个函数完全没被调用的原因。这个方法是后续版本(比如Ember Data 3.x+)才引入的,所以在2.18的版本里根本不会触发它。
另外还要提一句你代码里的小问题:你用了箭头函数定义方法,即使这个方法存在,箭头函数也会导致this无法正确指向Adapter实例,this._super()根本不会生效,以后写Ember类的方法时,尽量用普通函数语法。
下面给你两种可行的解决方案:
方案一:重写updateRecord方法(精准适配更新场景)
直接在Adapter里重写updateRecord钩子,手动把请求方法改成PUT:
import App from './../app'; import DS from "ember-data"; import { computed } from "@ember/object"; import { camelize } from '@ember/string'; import JSONAPIAdapter from "ember-data/adapters/json-api"; export default DS.JSONAPIAdapter.extend({ coalesceFindRequests: true, host: App.GPT.Configuration.restServer, updateRecord(store, type, snapshot) { let url = this.buildURL(type.modelName, snapshot.id, snapshot, 'updateRecord'); let data = this.serialize(snapshot, { includeId: true }); // 直接用PUT替代默认的PATCH方法 return this.ajax(url, 'PUT', { data: data }); }, pathForType(type) { return camelize(type) + 's'; }, headers: computed(function () { if (!App.StoreUtil.getSessionId()) { if (App.GPT.ApplicationController) { App.GPT.ApplicationController.set("hasMessages", [ { message: "Session expired." } ]); App.GPT.ApplicationController.transitionToRoute("/"); } else { window.location = "/"; } } return { sid: App.StoreUtil.getSessionId() }; }).volatile() });
方案二:重写ajaxOptions方法(更通用的请求方法替换)
如果以后还需要修改其他请求类型的方法,可以用这种更通用的方式,在ajaxOptions里判断并替换请求方法:
import App from './../app'; import DS from "ember-data"; import { computed } from "@ember/object"; import { camelize } from '@ember/string'; import JSONAPIAdapter from "ember-data/adapters/json-api"; export default DS.JSONAPIAdapter.extend({ coalesceFindRequests: true, host: App.GPT.Configuration.restServer, ajaxOptions(url, type, options) { // 把所有PATCH请求替换为PUT let modifiedMethod = type === 'PATCH' ? 'PUT' : type; // 调用父类的ajaxOptions,传入修改后的方法 return this._super(url, modifiedMethod, options); }, pathForType(type) { return camelize(type) + 's'; }, headers: computed(function () { if (!App.StoreUtil.getSessionId()) { if (App.GPT.ApplicationController) { App.GPT.ApplicationController.set("hasMessages", [ { message: "Session expired." } ]); App.GPT.ApplicationController.transitionToRoute("/"); } else { window.location = "/"; } } return { sid: App.StoreUtil.getSessionId() }; }).volatile() });
内容的提问来源于stack exchange,提问作者Divyanshu Chauhan
相关产品推荐
相关产品推荐

