Feathers: 如果 service.get(id) 已经存在,则失败/禁止 service.create

创建于 2017-06-23  ·  4评论  ·  资料来源: feathersjs/feathers

当数据库中具有相同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`)))
  })
}

最有用的评论

谢谢您的帮助。 这是解决方案,对于其他遇到相同问题的人:

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

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

  return Model;
}

所有4条评论

作为钩子的旁白,你的钩子有一个常见的问题,即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;
}

此问题已自动锁定,因为它关闭后没有任何近期活动。 请打开一个新问题,并提供指向此问题的链接以获取相关错误。

此页面是否有帮助?
0 / 5 - 0 等级