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
    }
  }
}
Другие вопросы по тегам