كنت أتوقع فشل 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`)))
})
}
وبغض النظر عن الخطافات ، هناك مشكلة شائعة في الخطاف الخاص بك ، وهي 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;
}
تم قفل هذه المشكلة تلقائيًا نظرًا لعدم وجود أي نشاط حديث بعد إغلاقه. الرجاء فتح مشكلة جديدة مع ارتباط لهذه المشكلة للأخطاء ذات الصلة.
التعليق الأكثر فائدة
شكرا للمساعدة. هذا هو الحل للآخرين الذين يتعثرون في نفس الشيء: