Feathers: Fallar / rechazar service.create si service.get (id) ya existe

Creado en 23 jun. 2017  ·  4Comentarios  ·  Fuente: feathersjs/feathers

Esperaba que service.create(obj) fallara cuando ya existía una entrada existente con el mismo id en la base de datos. No estoy seguro si esto está en el alcance de feathers, la interfaz de servicio de base de datos específica (aquí feathers-nedb) o feathers-hooks-common.

pasos para reproducir

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

Comportamiento esperado

Esperaba que el segundo users.create fallara.

Comportamiento real

El mismo usuario se agrega a la base de datos dos veces.

Gancho propuesto

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

Comentario más útil

Gracias por la ayuda. Aquí está la solución, para otros que tropiezan con lo mismo:

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 comentarios

Aparte de los ganchos, hay un problema que comúnmente se pasa por alto con su gancho, el param . Por ejemplo, no se pasa información de autenticación con get . Vea cómo lo maneja el gancho stashBefore .

Este es un problema que generalmente debería ser manejado por la base de datos por razones de eficiencia. Definitivamente es posible implementarlo como un gancho, pero no será tan eficiente como usar índices de restricción únicos de NeDB: https://github.com/louischatriot/nedb/wiki/Indexing

Gracias por la ayuda. Aquí está la solución, para otros que tropiezan con lo mismo:

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 se ha bloqueado automáticamente ya que no ha habido ninguna actividad reciente después de que se cerró. Abra un nuevo problema con un enlace a este problema para errores relacionados.

¿Fue útil esta página
0 / 5 - 0 calificaciones