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.
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
});
}
Eu esperava que o segundo users.create
falhasse.
O mesmo usuário é adicionado ao banco de dados duas vezes.
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`)))
})
}
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.
Comentários muito úteis
Obrigado pela ajuda. Aqui está a solução, para outros que tropeçam na mesma: