Я ожидал, что service.create(obj)
завершится ошибкой, когда существующая запись с тем же id
в базе данных уже существует. Не уверен, относится ли это к сфере перьев, конкретного интерфейса службы базы данных (здесь перья-недб) или перьев-крючков-общих.
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
});
}
Я ожидал, что второй users.create
не удастся.
Один и тот же пользователь добавляется в базу данных дважды.
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`)))
})
}
Помимо хуков, есть часто упускаемая из виду проблема с вашим хуком - значение param
. Например, информация для аутентификации не передается с get
. Посмотрите, как с этим справляется крючок stashBefore
.
Это проблема, которая обычно должна решаться базой данных из соображений эффективности. Это определенно можно реализовать в виде ловушки, но это будет не так эффективно, как использование уникальных индексов ограничений NeDB: https://github.com/louischatriot/nedb/wiki/Indexing
Спасибо за помощь. Вот решение для других, наткнувшихся на то же самое:
function userModel() {
let Model = new NeDB({
filename: 'users.db',
autoload: true
});
Model.ensureIndex({ fieldName: 'email', unique: true }, err => {
if (err) throw err
});
return Model;
}
Эта проблема была автоматически заблокирована, поскольку после ее закрытия в последнее время не было никаких действий. Пожалуйста, откройте новую проблему со ссылкой на эту проблему для связанных ошибок.
Самый полезный комментарий
Спасибо за помощь. Вот решение для других, наткнувшихся на то же самое: