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.
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
});
}
Je m'attendais à ce que le deuxième users.create
échoue.
Le même utilisateur est ajouté deux fois à la base de données.
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`)))
})
}
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.
Commentaire le plus utile
Merci pour l'aide. Voici la solution, pour les autres qui trébuchent sur la même chose :