Feathers: Échec / interdit service.create si service.get(id) existe déjà

Créé le 23 juin 2017  ·  4Commentaires  ·  Source: feathersjs/feathers

Je m'attendais service.create(obj) ce que id dans la base de données existait déjà. Je ne sais pas si cela fait partie de la portée de plumes, de l'interface de service de base de données spécifique (ici plumes-nedb) ou de plumes-hooks-common.

Étapes à reproduire

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

Comportement prévisible

Je m'attendais à ce que le deuxième users.create échoue.

Comportement réel

Le même utilisateur est ajouté deux fois à la base de données.

Crochet proposé

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

Commentaire le plus utile

Merci pour l'aide. Voici la solution, pour les autres qui trébuchent sur la même chose :

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

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

  return Model;
}

Tous les 4 commentaires

En passant sur les crochets, il y a un problème souvent manqué avec votre crochet, la param . Par exemple, aucune information d'authentification n'est transmise avec le get . Voyez comment le crochet stashBefore gère.

C'est un problème qui devrait généralement être traité par la base de données pour des raisons d'efficacité. Il est certainement possible de l'implémenter en tant que hook, mais ce ne sera pas aussi efficace que d'utiliser les index de contraintes uniques NeDB : https://github.com/louischatriot/nedb/wiki/Indexing

Merci pour l'aide. Voici la solution, pour les autres qui trébuchent sur la même chose :

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

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

  return Model;
}

Ce problème a été automatiquement verrouillé car il n'y a eu aucune activité récente après sa fermeture. Veuillez ouvrir un nouveau problème avec un lien vers ce problème pour les bogues liés.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

jordanbtucker picture jordanbtucker  ·  4Commentaires

perminder-klair picture perminder-klair  ·  3Commentaires

rrubio picture rrubio  ·  4Commentaires

andysay picture andysay  ·  3Commentaires

corymsmith picture corymsmith  ·  4Commentaires