当数据库中具有相同id
现有条目已经存在时,我预计service.create(obj)
会失败。 不确定这个是否在feather的范围内,具体的数据库服务接口(这里是feathers-nedb)或者feathers-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
});
}
我预计第二个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 :
谢谢您的帮助。 这是解决方案,对于其他遇到相同问题的人:
function userModel() {
let Model = new NeDB({
filename: 'users.db',
autoload: true
});
Model.ensureIndex({ fieldName: 'email', unique: true }, err => {
if (err) throw err
});
return Model;
}
此问题已自动锁定,因为它关闭后没有任何近期活动。 请打开一个新问题,并提供指向此问题的链接以获取相关错误。
最有用的评论
谢谢您的帮助。 这是解决方案,对于其他遇到相同问题的人: