Feathers: Отказаться / запретить service.create, если service.get (id) уже существует

Созданный на 23 июн. 2017  ·  4Комментарии  ·  Источник: feathersjs/feathers

Я ожидал, что service.create(obj) завершится ошибкой, когда существующая запись с тем же id в базе данных уже существует. Не уверен, относится ли это к сфере перьев, конкретного интерфейса службы базы данных (здесь перья-недб) или перьев-крючков-общих.

Действия по воспроизведению

const feathers = require('feathers');
const NeDB = require('nedb');
const service = require('feathers-nedb');

const app = feathers()
app.use('/users', service({ Model: userModel(), id: 'email' }));

const users = app.service('/users');
let user = { email: '[email protected]', password: '11111', role: 'admin' }
Promise.all([
  users.create(user),
  users.create(user)
]).then(results => console.log(results))
  .catch(err => console.log('Error occurred:', err));

function userModel() {
  return new NeDB({
    filename: 'users.db',
    autoload: true
  });
}

Ожидаемое поведение

Я ожидал, что второй users.create не удастся.

Фактическое поведение

Один и тот же пользователь добавляется в базу данных дважды.

Предлагаемый крючок

const { validate } = require('feathers-hooks-common')

/**
 * Checks if item with same id already exists.
 */
module.exports = function unique () {
  return validate((values, hook) => {
    return hook.service.get(values[hook.service.id])
      .catch(() => null)  // not found, pass null to next .then
      .then(res => res === null
        ? null
        : Promise.reject(new Error(`${res[hook.service.id]} already exists in db`)))
  })
}

Самый полезный комментарий

Спасибо за помощь. Вот решение для других, наткнувшихся на то же самое:

function userModel() {
  let Model = new NeDB({
    filename: 'users.db',
    autoload: true
  });

  Model.ensureIndex({ fieldName: 'email', unique: true }, err => {
    if (err) throw err
  });

  return Model;
}

Все 4 Комментарий

Помимо хуков, есть часто упускаемая из виду проблема с вашим хуком - значение param . Например, информация для аутентификации не передается с get . Посмотрите, как с этим справляется крючок stashBefore .

Это проблема, которая обычно должна решаться базой данных из соображений эффективности. Это определенно можно реализовать в виде ловушки, но это будет не так эффективно, как использование уникальных индексов ограничений NeDB: https://github.com/louischatriot/nedb/wiki/Indexing

Спасибо за помощь. Вот решение для других, наткнувшихся на то же самое:

function userModel() {
  let Model = new NeDB({
    filename: 'users.db',
    autoload: true
  });

  Model.ensureIndex({ fieldName: 'email', unique: true }, err => {
    if (err) throw err
  });

  return Model;
}

Эта проблема была автоматически заблокирована, поскольку после ее закрытия в последнее время не было никаких действий. Пожалуйста, откройте новую проблему со ссылкой на эту проблему для связанных ошибок.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги