You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:44:10