Node-redis: Serialisasi nilai nol dalam hash

Dibuat pada 13 Jun 2013  ·  19Komentar  ·  Sumber: NodeRedis/node-redis

ketika nilai kunci yang disetel melalui hset adalah nol, itu diserialisasi sebagai string "null". Ketika hash diambil melalui hgetall, nilai yang sesuai dalam objek yang dikembalikan adalah string "null" daripada null.

Feature Request v4

Komentar yang paling membantu

Saya menyadari bahwa node-redis tidak melakukan konversi tipe data apa pun untuk nilai string yang diambil dari redis. Saya secara implisit berasumsi bahwa boolean, angka, dll. Akan otomatis diubah menjadi tipe javascript masing-masing. Jika Anda tidak menganggap ini berada dalam lingkup proyek, harap tutup masalah.

Tetapi konversi otomatis akan menyenangkan untuk dimiliki. Saya baru saja menghabiskan banyak waktu untuk men-debug bug yang muncul karena nilai salah diambil sebagai "salah" dan melewati kondisi pemeriksaan kebenaran javascript.

Semua 19 komentar

Saya menyadari bahwa node-redis tidak melakukan konversi tipe data apa pun untuk nilai string yang diambil dari redis. Saya secara implisit berasumsi bahwa boolean, angka, dll. Akan otomatis diubah menjadi tipe javascript masing-masing. Jika Anda tidak menganggap ini berada dalam lingkup proyek, harap tutup masalah.

Tetapi konversi otomatis akan menyenangkan untuk dimiliki. Saya baru saja menghabiskan banyak waktu untuk men-debug bug yang muncul karena nilai salah diambil sebagai "salah" dan melewati kondisi pemeriksaan kebenaran javascript.

Benar, yang benar/salah adalah yang mendapatkan saya juga.

Saya sebenarnya ingin membahas ini di perpustakaan, meskipun pasti ada masalah kinerja.

@brycebaril kita bisa memperkenalkan bendera ke JSON.stringify/parsing input. Itu harus menjadi solusi yang baik, bukan begitu?

Mungkin ada opsi di konstruktor createClient. Sesuatu seperti...
_parse_bool_: mengubah "benar" menjadi benar, "salah" menjadi salah
_parse_null_: mengonversi "null" menjadi null

Tapi lalu bagaimana Anda menangani nilai string sebenarnya dari "true" dan "null"? Tidak ada cara untuk mendeteksi apa tipe input aslinya.

@Azmisov seperti yang ditunjukkan oleh @dirkbonhomme ini bukan solusi yang baik. Oleh karena itu hanya menggunakan JSON.stringify/parse mungkin menjadi pilihan.

Saya ingin menyelesaikan ini bukan pada basis perintah tertentu tetapi untuk semua perintah. Dengan begitu juga tidak ada penalti kinerja, karena kami tetap memeriksa setiap argumen dan yang lebih penting: itu diselesaikan untuk perintah apa pun tidak peduli bagaimana Anda meneruskan argumen (array, objek, argumen).

Saya lebih suka mengembalikan kesalahan jika ada perintah yang berisi nilai yang tidak ditentukan atau nol. Ini hampir selalu merupakan tanda bahwa ada sesuatu yang salah dengan argumen yang diberikan.
Beberapa orang mungkin ingin memiliki cara untuk menangani nilai yang tidak ditentukan dan atau nol yang berbeda, jadi saya akan menambahkan opsi yang dapat Anda lewati fungsi dan fungsi ini dipicu jika ada perintah yang berisi nilai nol/tidak terdefinisi.
Fungsi itu selalu mendapatkan nama perintah dan argumen yang diteruskan ke sana dan nilai yang dikembalikan akan menggantikan argumen asli. Dengan cara itu setiap pengguna dapat menangani nilai-nilai ini seperti yang mereka inginkan.
Logika yang sama dapat diterapkan untuk benar/salah.

@NodeRedis/contributor @dirkbonhomme bagaimana menurut Anda? :)

@BridgeAR Saya tidak setuju bahwa null adalah 'pertanda bahwa ada sesuatu yang salah'. Ambil sesuatu seperti ini:

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);

Katakanlah jika 'address2' adalah opsional dalam data Anda, maka pengembalian null tidak masalah.

Karena itu, saya pikir ini akan menjadi perubahan besar bagi banyak orang sehingga sesuatu seperti yang Anda usulkan harus opsional, bukan default.

@stockholmux Saya tidak yakin kita membicarakan hal yang sama. Nilai pengembalian tidak akan diubah dengan cara apa pun.

Yang ingin saya ubah adalah menggunakan null akan menghasilkan string 'null' sebagai gantinya:

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

Saya juga tidak akan merusak apa pun, karena saya berencana untuk mencela perilaku lama (beberapa orang mungkin mengandalkan perilaku yang rusak dengan membangun di sekitar masalah) dan menambahkan opsi untuk menangani ini sendiri sekarang dan mengembalikan kesalahan dari v.3.0.0 untuk nilai tersebut.

Apakah masalah 'null'value teratasi atau tidak?

Apakah Anda akan mendefinisikan token khusus dalam program Anda yang mewakili nilai nol yang sebenarnya. Ketika pengguna menyetel sesuatu ke nol, Anda menangkap perintah itu dan mengganti nilai nol dengan token khusus Anda. Ketika pengguna mendapatkan hal itu, Anda menangkap perintah itu dan mengganti token khusus dengan nilai nol nyata kepada pengguna?

Hanya sebuah saran. masalah ini benar-benar mengganggu. Karena setiap pengguna di situs mana pun dapat memiliki nama yang disebut 'null' , Anda tidak ingin mengurai nama pengguna ke nilai nol yang sebenarnya;

Apakah ada kemajuan, atau keputusan, yang telah dibuat pada flag "JSON.{parse,stringify} on input"? Akan lebih baik jika ini dilakukan secara otomatis alih-alih dalam logika get/set yang diberikan.

Hei @taylorzane Saya punya sedikit waktu saat ini tetapi pasti direncanakan untuk mengimplementasikannya.

Itu terdengar baik. Jika saya punya waktu, saya dapat mencobanya, itu pasti akan menyenangkan untuk dimiliki, dan saya menikmati meretas sumber modul yang saya gunakan. :+1:

Apakah ini bekerja sekarang?

Saya akhirnya menggunakan metode berbeda untuk membuat serialisasi data ke dalam Redis, jadi saya tidak pernah sempat mengimplementasikannya.

Jika Anda tidak keberatan berbagi @taylorzane bagaimana Anda menyimpan objek JSON dengan bidang yang mungkin memiliki nilai nol di dalamnya menggunakan Redis

@slidenerd Saya meratakan objek JSON, dan kemudian membuat serialisasi setiap nilai simpul yang diratakan sebelum menyimpannya di Redis. Jadi semua nilai adalah string. Performanya sangat bagus bahkan dengan ribuan nilai yang dide/serialized.

Contoh:

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\""
  */
})

Jangan ragu untuk menghubungi saya di Gitter atau melalui email di profil saya, jika Anda menginginkan panduan lebih lanjut.

@slidenerd Pilihan lainnya adalah menggunakan ReJSON untuk menyimpan objek JSON Anda - ini biasanya merupakan opsi yang lebih baik yang membuat serialisasi semuanya secara manual dan dapat menangani null dan tidak terdefinisi. Ini Modul Redis, jadi Anda harus memiliki versi yang mendukungnya (4.0+) dan menginstal modul ke server. Ini di luar cakupan modul Node.js ini (dan masalah ini), tetapi ini menyelesaikan masalah.

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

Terima kasih @stockholmux Saya menemukan solusi yang lebih baik tanpa menggunakan ketergantungan eksternal, idenya adalah menggunakan fungsi pengganti dalam metode JSON.stringify yang kebetulan merupakan argumen kedua

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

Atala picture Atala  ·  3Komentar

adamgajzlerowicz picture adamgajzlerowicz  ·  4Komentar

dotSlashLu picture dotSlashLu  ·  5Komentar

michaelwittig picture michaelwittig  ·  3Komentar

lemon707 picture lemon707  ·  3Komentar