将 store.queryRecord 与 Ember Octane 一起使用时出现错误 "str.replace is not a function"
Error "str.replace is not a function" when using store.queryRecord with Ember Octane
我正在学习 Embercasts 课程 (Ember + Rails)。对于截屏视频,他们使用 Ember 3.0,但我使用的是 Octane。
在一个视频中,实现了一项自定义服务。这是我的版本:
import Service, { inject as service } from '@ember/service';
export default class CurrentUserService extends Service {
@service store;
load() {
this.store.queryRecord('user', { me: true })
.then((user) => {
this.set('user', user);
})
.catch((e) => {
debugger;
});
}
}
在从路由调用的 load
函数中,this.store.queryRecord()
导致错误:
TypeError: str.replace is not a function
at Cache.func (index.js:64)
at Cache.get (index.js:774)
at decamelize (index.js:167)
at Cache.func (index.js:32)
at Cache.get (index.js:774)
at Object.dasherize (index.js:190)
at UserAdapter.pathForType (json-api.js:221)
at UserAdapter._buildURL (-private.js:293)
at UserAdapter.buildURL (-private.js:275)
at UserAdapter.urlForQueryRecord (user.js:13)
相关行是
var DECAMELIZE_CACHE = new _utils.Cache(1000, str => str.replace(STRING_DECAMELIZE_REGEXP, '_').toLowerCase());
这是UserAdapter
:
import ApplicationAdapter from './application';
export default class UserAdapter extends ApplicationAdapter {
urlForQueryRecord(query) {
if (query.me) {
delete query.me;
return `${super.buildURL(...arguments)}/me`;
}
return `${super.buildURL(...arguments)}`;
}
}
这是怎么回事?
当您执行 super.buildURL(...arguments)
时,您实际上是在执行 super.buildURL(query)
。 query
是一个对象 ({ me: true }
) 而不是字符串,而 buildURL
期望 modelName
作为第一个参数。
所以你可能想做这样的事情:
urlForQueryRecord(query, modelName) {
if (query.me) {
delete query.me;
return `${super.buildURL(modelName)}/me`;
}
return `${super.buildURL(modelName)}`;
}
我正在学习 Embercasts 课程 (Ember + Rails)。对于截屏视频,他们使用 Ember 3.0,但我使用的是 Octane。
在一个视频中,实现了一项自定义服务。这是我的版本:
import Service, { inject as service } from '@ember/service';
export default class CurrentUserService extends Service {
@service store;
load() {
this.store.queryRecord('user', { me: true })
.then((user) => {
this.set('user', user);
})
.catch((e) => {
debugger;
});
}
}
在从路由调用的 load
函数中,this.store.queryRecord()
导致错误:
TypeError: str.replace is not a function
at Cache.func (index.js:64)
at Cache.get (index.js:774)
at decamelize (index.js:167)
at Cache.func (index.js:32)
at Cache.get (index.js:774)
at Object.dasherize (index.js:190)
at UserAdapter.pathForType (json-api.js:221)
at UserAdapter._buildURL (-private.js:293)
at UserAdapter.buildURL (-private.js:275)
at UserAdapter.urlForQueryRecord (user.js:13)
相关行是
var DECAMELIZE_CACHE = new _utils.Cache(1000, str => str.replace(STRING_DECAMELIZE_REGEXP, '_').toLowerCase());
这是UserAdapter
:
import ApplicationAdapter from './application';
export default class UserAdapter extends ApplicationAdapter {
urlForQueryRecord(query) {
if (query.me) {
delete query.me;
return `${super.buildURL(...arguments)}/me`;
}
return `${super.buildURL(...arguments)}`;
}
}
这是怎么回事?
当您执行 super.buildURL(...arguments)
时,您实际上是在执行 super.buildURL(query)
。 query
是一个对象 ({ me: true }
) 而不是字符串,而 buildURL
期望 modelName
作为第一个参数。
所以你可能想做这样的事情:
urlForQueryRecord(query, modelName) {
if (query.me) {
delete query.me;
return `${super.buildURL(modelName)}/me`;
}
return `${super.buildURL(modelName)}`;
}