Loopback REST findById не работает хорошо
Я хотел бы использовать findById
функционировать через REST API.
Я определил "ID" как строку, построенную по номеру.
Я пытаюсь найти по идентификатору, система, кажется, распознает его номер.
Я не могу использовать его, когда идентификатор больше "9007199254740992" - максимальное число целых чисел.
Я хотел бы использовать идентификатор как строку.
Подскажите пожалуйста как решить эту проблему.
Спасибо,
--следовать за--
Моя программа следующая.
Модель - образец-модель.json
{
"name": "SampleModel",
"base": "PersistedModel",
"idInjection": true,
"properties": {
"id": {
"type": "string",
"id": "true",
"required": true,
"doc": "MODEL ID"
},
"prop1": {
"type": "string",
"required": true
}
},
"validations": [],
"relations": {},
"acls": [],
"methods": []
}
Когда я получаю доступ к findById
Функция через REST API, я всегда получаю следующее сообщение отладки.
strong-remoting:shared-method - findById - invoke with +11ms [ 9007199254740992, undefined, [Function: callback] ]
strong-remoting:shared-method - findById - result null +25ms
strong-remoting:rest-adapter Invoking rest.after for SampleModel.findById +6ms
express:router restRemoteMethodNotFound : /api/SampleModels/9007199254740993 +143ms
express:router restUrlNotFound : /api/SampleModels/9007199254740993 +8ms
express:router restErrorHandler : /api/SampleModels/9007199254740993 +2ms
strong-remoting:rest-adapter Error in GET /SampleModels/9007199254740993: Error: Unknown "SampleModel" id "9007199254740993".
2 ответа
Я решил свой вопрос сам.
Мы можем определить аргументы, которые удаленный метод принимает, используя опцию "accept".
Встроенный findById
Функция определяется следующим образом в PersistedModel:
accepts: [
{ arg: 'id', type: 'any', description: 'Model id', required: true,
http: {source: 'path'}},
{ arg: 'filter', type: 'object',
description: 'Filter defining fields and include'}
],
Когда type
определено any
, id
изменения в числе на HttpContext.coerce
функция - если id
состоит только из числа символов.
Чтобы решить эту проблему, я определяю SampleModel.findByIdCustom
и создайте другой удаленный метод следующим образом:
SampleModel.js
SampleModel.findByIdCustom = function(id, filter, cb) {
SampleModel.findById(id, filter, cb);
}
//Define remote method
SampleModel.remoteMethod(
'findByIdCustom',
{
description: 'Find a model instance by id from the data source.',
accessType: 'READ',
accepts: [
{ arg: 'id', type: 'string', description: 'Model id', required: true,
http: {source: 'path'}},
{ arg: 'filter', type: 'object',
description: 'Filter defining fields and include'}
],
returns: {arg: 'data', type: 'user', root: true},
http: {verb: 'get', path: '/:id'},
rest: {after: SampleModel.convertNullToNotFoundError},
isStatic: true
}
);
//disable built-in remote method
SampleMethod.disableRemoteMethod('findById', true);
Спасибо,
Просто установите idInjection
в false
(так что loopback не добавляет автоматически свойство id в вашу модель), затем определите свойство со следующими параметрами:
{
"idInjection": false,
"properties": {
"id": {
"type": "string",
"id": true,
"generated": true
}
}
}