Node-redis: تسلسل القيم الخالية في تجزئة

تم إنشاؤها على ١٣ يونيو ٢٠١٣  ·  19تعليقات  ·  مصدر: NodeRedis/node-redis

عندما تكون قيمة المفتاح الذي يتم تعيينه من خلال hset فارغة ، يتم إجراء تسلسل لها كسلسلة "خالية". عندما يتم استرداد التجزئة من خلال hgetall ، فإن القيمة المقابلة في الكائن المُعاد هي سلسلة "خالية" وليست خالية.

Feature Request v4

التعليق الأكثر فائدة

أدركت أن node-redis لا تقوم بأي تحويل لنوع البيانات لقيم السلسلة المسترجعة من redis. لقد افترضت ضمنيًا أن القيم المنطقية والأرقام وما إلى ذلك سيتم تحويلها تلقائيًا إلى نوع جافا سكريبت ذي الصلة. إذا كنت لا تعتبر هذا ضمن نطاق المشروع ، فالرجاء إغلاق المشكلة.

ومع ذلك ، سيكون من الجيد إجراء التحويل التلقائي. لقد أمضيت للتو قدرًا كبيرًا من الوقت في تصحيح الأخطاء الناشئة عن قيمة خاطئة يتم استردادها على أنها "خطأ" وتمريرها عبر شروط التحقق من صحة جافا سكريبت.

ال 19 كومينتر

أدركت أن node-redis لا تقوم بأي تحويل لنوع البيانات لقيم السلسلة المسترجعة من redis. لقد افترضت ضمنيًا أن القيم المنطقية والأرقام وما إلى ذلك سيتم تحويلها تلقائيًا إلى نوع جافا سكريبت ذي الصلة. إذا كنت لا تعتبر هذا ضمن نطاق المشروع ، فالرجاء إغلاق المشكلة.

ومع ذلك ، سيكون من الجيد إجراء التحويل التلقائي. لقد أمضيت للتو قدرًا كبيرًا من الوقت في تصحيح الأخطاء الناشئة عن قيمة خاطئة يتم استردادها على أنها "خطأ" وتمريرها عبر شروط التحقق من صحة جافا سكريبت.

صحيح ، الصواب / الخطأ هو الذي يحصل لي أيضًا.

أود بالفعل معالجة هذا الأمر في المكتبة ، على الرغم من وجود مخاوف تتعلق بالأداء بالتأكيد.

brycebaril يمكننا تقديم إشارة إلى JSON.stringify / تحليل المدخلات. يجب أن يكون هذا حلاً جيدًا ، ألا تعتقد ذلك؟

ربما يمكن أن يكون هناك خيار في منشئ createClient. شيء مثل...
_parse_bool_: يحول "صواب" إلى "صواب" و "خطأ" إلى خطأ
_parse_null_: تحويل "خالية" إلى لاغية

ولكن كيف ستتعامل بعد ذلك مع قيمة السلسلة الفعلية لـ "true" و "null"؟ لا توجد طريقة لاكتشاف نوع الإدخال الأصلي.

Azmisov كما أشار dirkbonhomme إلى أن هذا لن يكون حلاً جيدًا. لذلك فإن استخدام JSON.stringify / parse فقط قد يكون خيارًا.

أرغب في حل هذا ليس على قاعدة أوامر محددة ولكن لجميع الأوامر. بهذه الطريقة أيضًا لا توجد عقوبة أداء ، نظرًا لأننا نتحقق من كل حجة على أي حال والأهم من ذلك: يتم حلها لأي أمر بغض النظر عن كيفية تمرير الوسائط (مصفوفة ، كائن ، وسيطات).

أفضل إرجاع خطأ إذا احتوى أي أمر على قيمة غير محددة أو فارغة. غالبًا ما تكون هذه علامة على وجود خطأ ما في الحجج التي تم تمريرها.
قد يرغب بعض الأشخاص في الحصول على طريقة للتعامل مع القيم غير المحددة و / أو الخالية بشكل مختلف ، لذلك سأضيف خيارًا يمكنك تمرير وظيفة إليه ويتم تشغيل هذه الوظيفة إذا كان أي أمر يحتوي على قيمة خالية / غير محددة.
تحصل هذه الوظيفة دائمًا على اسم الأمر والوسيطات التي تم تمريرها إليها وستحل قيمة الإرجاع محل الوسيطة (الوسائط) الأصلية. بهذه الطريقة يمكن لأي مستخدم التعامل مع هذه القيم كما يريد.
يمكن تطبيق نفس المنطق على صواب / خطأ.

@ NodeRedis / المساهمون dirkbonhomme ما رأيك؟ :)

BridgeAR لا أوافق على أن null هو "علامة على وجود خطأ ما". خذ شيئًا مثل هذا:

var myIndexes = ['one','two','three'], myMulti = client.multi();

myIndexes.forEach(function(aKey) { 
  myMulti.hget(aKey,'username'); 
  myMulti.hget(aKey,'address1');  
  myMulti.hget(aKey,'address2');
});

myMulti.exec(cb);

لنفترض أنه إذا كان "العنوان 2" اختياريًا في بياناتك ، فسيكون العائد null جيدًا.

ومع ذلك ، أعتقد أنه سيكون تغييرًا جذريًا للعديد من الأشخاص ، لذا يجب أن يكون شيء ما تقترحه اختياريًا وليس افتراضيًا.

stockholmux لست متأكدًا من أننا نتحدث عن نفس الشيء. لن يتم تغيير قيمة الإرجاع بأي وسيلة.

ما أريد تغييره هو أن استخدام null سينتج عنه 'null' بدلاً من ذلك:

client.set('foo', null);
client.get('foo', function (err, res) {
    console.log(res); // 'null'
});

لن أتخلص من أي شيء أيضًا ، لأنني أخطط لإهمال السلوك القديم (قد يعتمد بعض الأشخاص على السلوك المعطل من خلال البناء حول المشكلة) وإضافة خيار التعامل مع هذا بنفسك الآن وإرجاع خطأ من v.3.0.0 لهذه القيم.

هل يتم حل مشكلة "القيمة الفارغة" أم لا؟

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

مجرد اقتراح. هذه القضية تزعجك حقًا. نظرًا لأن أي مستخدم في أي موقع يمكن أن يكون له اسم يسمى "فارغ" ، فلن ترغب في تحليل اسم المستخدم إلى القيمة الحقيقية الخالية ؛

هل تم اتخاذ أي تقدم أو قرار بشأن علامة "JSON. {parse، stringify} بشأن الإدخال"؟ سيكون من الجيد أن يتم ذلك تلقائيًا بدلاً من أي منطق get / set معين.

مرحبًا taylorzane لدي القليل من الوقت في الوقت الحالي ولكن من المخطط بالتأكيد تنفيذ ذلك.

من الجيد سماع ذلك. إذا كان لدي بعض الوقت لأخذ طعنة في ذلك ، فسيكون من الجيد بالتأكيد الحصول عليه ، وأنا أستمتع بالقرصنة من مصدر الوحدات التي أستخدمها. : +1:

هل هذا يعمل الآن؟

انتهى بي الأمر باستخدام طريقة مختلفة لتسلسل البيانات إلى Redis ، لذلك لم أتمكن من تنفيذ ذلك مطلقًا.

إذا كنت لا تمانع في مشاركة taylorzane ، فكيف تخزن كائنات JSON مع الحقول التي قد تحتوي على قيم فارغة بداخلها باستخدام Redis

slidenerd أقوم بترتيب قيمة كل عقدة مسطحة قبل تخزينها في Redis. لذا فإن كل القيم عبارة عن سلاسل. إنه ذو أداء كبير حتى مع إزالة / تسلسل آلاف القيم.

مثال:

const a = {
  a: {
    b: {
      c: null,
      d: true,
      e: "hello"
    }
  }
}

const b = flatten(a)
console.log(b) /* =>
{
  '/a/b/c': null,
  '/a/b/d': true,
  '/a/b/e': 'hello'
}
*/

Object.entries(b).forEach(([key, value]) => {
  redis.set(key, JSON.stringify(value)) // or
  redis.hset('my_hash', key, JSON.stringify(value)) /*
  => "/a/b/c" -> "null"
  => "/a/b/d" -> "true"
  => "/a/b/e" -> "\"hello\""
  */
})

لا تتردد في التواصل معي على Gitter أو عبر البريد الإلكتروني في ملفي الشخصي ، إذا كنت تريد المزيد من الإرشادات.

slidenerd الخيار الآخر هو استخدام ReJSON لتخزين كائنات JSON الخاصة بك - عادةً ما يكون خيارًا أفضل لتسلسل كل شيء يدويًا ويمكنه التعامل مع القيم الخالية وغير المحددة. إنها Redis Module ، لذا يجب أن يكون لديك إصدار يدعمها (4.0+) وتثبيت الوحدة في الخادم. إنه خارج نطاق وحدة Node.js هذه (وهذه المشكلة) ، لكنه يحل المشكلة.

            items.push(JSON.stringify(object, (key, value) => {
                if (value === null || value === undefined) {
                    return undefined
                }
                else {
                    return isNaN(parseFloat(value)) ? value : parseFloat(value)
                }
            }))

شكرًا stockholmux لقد توصلت إلى حل أفضل دون استخدام تبعية خارجية ، الفكرة هي استخدام وظيفة الاستبدال في طريقة JSON.stringify التي تصادف أنها الوسيطة الثانية

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