Feathers: فشل / عدم السماح service.create إذا كانت service.get (id) موجودة بالفعل

تم إنشاؤها على ٢٣ يونيو ٢٠١٧  ·  4تعليقات  ·  مصدر: feathersjs/feathers

كنت أتوقع فشل service.create(obj) عندما يكون الإدخال الحالي بنفس id في قاعدة البيانات موجودًا بالفعل. لست متأكدًا مما إذا كان هذا في نطاق الريش ، أو واجهة خدمة قاعدة البيانات المحددة (هنا 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://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;
}

تم قفل هذه المشكلة تلقائيًا نظرًا لعدم وجود أي نشاط حديث بعد إغلاقه. الرجاء فتح مشكلة جديدة مع ارتباط لهذه المشكلة للأخطاء ذات الصلة.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات