Feathers: Falha / desautoriza service.create se service.get (id) já existe

Criado em 23 jun. 2017  ·  4Comentários  ·  Fonte: feathersjs/feathers

Eu esperava que service.create(obj) falhasse quando uma entrada existente com o mesmo id no banco de dados já existisse. Não tenho certeza se isso está no escopo de penas, a interface de serviço de banco de dados específica (aqui penas-nedb) ou penas-ganchos-comuns.

Passos para reproduzir

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
  });
}

Comportamento esperado

Eu esperava que o segundo users.create falhasse.

Comportamento real

O mesmo usuário é adicionado ao banco de dados duas vezes.

Gancho proposto

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`)))
  })
}

Comentários muito úteis

Obrigado pela ajuda. Aqui está a solução, para outros que tropeçam na mesma:

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

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

  return Model;
}

Todos 4 comentários

Como um aparte sobre os ganchos, há um problema comumente esquecido com o seu gancho, o param . Por exemplo, nenhuma informação de autenticação é passada com get . Veja como o gancho stashBefore lida com isso.

Esse é um problema que geralmente deve ser tratado pelo banco de dados por motivos de eficiência. É definitivamente possível implementar como um gancho, mas não será tão eficiente quanto usar índices de restrição exclusivos do NeDB: https://github.com/louischatriot/nedb/wiki/Indexing

Obrigado pela ajuda. Aqui está a solução, para outros que tropeçam na mesma:

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

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

  return Model;
}

Este problema foi bloqueado automaticamente, pois não houve nenhuma atividade recente depois que ele foi fechado. Abra um novo problema com um link para este problema para bugs relacionados.

Esta página foi útil?
0 / 5 - 0 avaliações