Node-redis: ํ•ด์‹œ์—์„œ null ๊ฐ’ ์ง๋ ฌํ™”

์— ๋งŒ๋“  2013๋…„ 06์›” 13์ผ  ยท  19์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: NodeRedis/node-redis

hset์„ ํ†ตํ•ด ์„ค์ •๋˜๋Š” ํ‚ค์˜ ๊ฐ’์ด null์ธ ๊ฒฝ์šฐ "null" ๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™”๋ฉ๋‹ˆ๋‹ค. hgetall์„ ํ†ตํ•ด ํ•ด์‹œ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ ๋ฐ˜ํ™˜๋œ ๊ฐœ์ฒด์˜ ํ•ด๋‹น ๊ฐ’์€ null์ด ์•„๋‹Œ "null" ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

Feature Request v4

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

node-redis๋Š” redis์—์„œ ๊ฐ€์ ธ์˜จ ๋ฌธ์ž์—ด ๊ฐ’์— ๋Œ€ํ•ด ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋ถ€์šธ, ์ˆซ์ž ๋“ฑ์ด ๊ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์œ ํ˜•์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜๋  ๊ฒƒ์ด๋ผ๊ณ  ์•”๋ฌต์ ์œผ๋กœ ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ”„๋กœ์ ํŠธ์˜ ๋ฒ”์œ„์— ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์ด์Šˆ๋ฅผ ์ข…๋ฃŒํ•˜์‹ญ์‹œ์˜ค.

ํ•˜์ง€๋งŒ ์ž๋™ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. false ๊ฐ’์ด "false"๋กœ ๊ฒ€์ƒ‰๋˜๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ง„์‹ค ๊ฒ€์‚ฌ ์กฐ๊ฑด์„ ํ†ต๊ณผํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” ๋ฒ„๊ทธ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์„ ํ• ์• ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  19 ๋Œ“๊ธ€

node-redis๋Š” redis์—์„œ ๊ฐ€์ ธ์˜จ ๋ฌธ์ž์—ด ๊ฐ’์— ๋Œ€ํ•ด ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋ถ€์šธ, ์ˆซ์ž ๋“ฑ์ด ๊ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์œ ํ˜•์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜๋  ๊ฒƒ์ด๋ผ๊ณ  ์•”๋ฌต์ ์œผ๋กœ ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ”„๋กœ์ ํŠธ์˜ ๋ฒ”์œ„์— ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์ด์Šˆ๋ฅผ ์ข…๋ฃŒํ•˜์‹ญ์‹œ์˜ค.

ํ•˜์ง€๋งŒ ์ž๋™ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. false ๊ฐ’์ด "false"๋กœ ๊ฒ€์ƒ‰๋˜๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ง„์‹ค ๊ฒ€์‚ฌ ์กฐ๊ฑด์„ ํ†ต๊ณผํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” ๋ฒ„๊ทธ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์„ ํ• ์• ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งž์•„์š”, ์ฐธ/๊ฑฐ์ง“๋„ ์ €๋ฅผ ์‚ฌ๋กœ์žก๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@brycebaril JSON.stringify/parse ์ž…๋ ฅ์— ํ”Œ๋ž˜๊ทธ๋ฅผ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

createClient ์ƒ์„ฑ์ž์— ์˜ต์…˜์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ญ”๊ฐ€...
_parse_bool_: "true"๋ฅผ true๋กœ, "false"๋ฅผ false๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
_parse_null_: "null"์„ null๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ "true"์™€ "null"์˜ ์‹ค์ œ ๋ฌธ์ž์—ด ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊นŒ์š”? ์›๋ž˜ ์ž…๋ ฅ ์œ ํ˜•์ด ๋ฌด์—‡์ธ์ง€ ๊ฐ์ง€ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

@dirkbonhomme ์˜ @Azmisov ๋Š” ์ด๊ฒƒ์ด ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด

ํŠน์ • ๋ช…๋ น ๊ธฐ๋ฐ˜์ด ์•„๋‹ˆ๋ผ ๋ชจ๋“  ๋ช…๋ น์— ๋Œ€ํ•ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜๋„ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์–ด์จŒ๋“  ๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ณ  ๋” ์ค‘์š”ํ•˜๊ฒŒ๋Š” ์ธ์ˆ˜(๋ฐฐ์—ด, ๊ฐ์ฒด, ์ธ์ˆ˜)๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ๋ช…๋ น์— ๋Œ€ํ•ด ํ•ด๊ฒฐ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ช…๋ น์— ์ •์˜๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ null ๊ฐ’์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฑฐ์˜ ํ•ญ์ƒ ์ „๋‹ฌ๋œ ์ธ์ˆ˜์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค.
์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ์ •์˜๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ null ๊ฐ’์„ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์›ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ช…๋ น์— null/์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ ์ด ํ•จ์ˆ˜๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ๋ช…๋ น ์ด๋ฆ„๊ณผ ์ „๋‹ฌ๋œ ์ธ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๋ฐ˜ํ™˜ ๊ฐ’์€ ์›๋ž˜ ์ธ์ˆ˜๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ด๋Ÿฌํ•œ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฐธ/๊ฑฐ์ง“์—๋„ ๋™์ผํ•œ ๋…ผ๋ฆฌ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ฐ์ดํ„ฐ์—์„œ 'address2'๊ฐ€ ์„ ํƒ ์‚ฌํ•ญ์ธ ๊ฒฝ์šฐ null ๋ฐ˜ํ™˜์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํš๊ธฐ์ ์ธ ๋ณ€๊ฒฝ์ด ๋  ๊ฒƒ์ด๋ฏ€๋กœ ์ œ์•ˆํ•˜์‹  ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์€ ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์„ ํƒ ์‚ฌํ•ญ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@stockholmux ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐ™์€ ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’์€ ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ null ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€์‹  'null' ๋ฌธ์ž์—ด์ด ์ƒ์„ฑ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ด์ „ ๋™์ž‘์„ ์ค‘๋‹จํ•˜๊ณ (์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ์ž˜๋ชป๋œ ๋™์ž‘์— ์˜์กดํ•  ์ˆ˜ ์žˆ์Œ) ์ง€๊ธˆ ๋‹น์žฅ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ด๋ฏ€๋กœ ์•„๋ฌด ๊ฒƒ๋„ ์ค‘๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ’์— ๋Œ€ํ•œ v.3.0.0.

'null' ๊ฐ’ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๊นŒ?

์‹ค์ œ null ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŠน์ˆ˜ ํ† ํฐ์„ ํ”„๋กœ๊ทธ๋žจ์— ์ •์˜ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ null๋กœ ์„ค์ •ํ•˜๋ฉด ํ•ด๋‹น ๋ช…๋ น์„ ์บก์ฒ˜ํ•˜๊ณ  null ๊ฐ’์„ ํŠน์ˆ˜ ํ† ํฐ์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๊ฒƒ์„ ๊ฐ€์ ธ์˜ค๋ฉด ํ•ด๋‹น ๋ช…๋ น์„ ์บก์ฒ˜ํ•˜๊ณ  ํŠน์ˆ˜ ํ† ํฐ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ค์ œ null ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ ์ œ์•ˆ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ •๋ง ๊ท€์ฐฎ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ์ดํŠธ์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” 'null' ์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์‹ค์ œ null ๊ฐ’์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"JSON.{parse,stringify} on input" ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•œ ์ง„ํ–‰์ด๋‚˜ ๊ฒฐ์ •์ด ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ์ฃผ์–ด์ง„ get/set ๋กœ์ง ๋Œ€์‹  ์ž๋™์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @taylorzane ํ˜„์žฌ ์‹œ๊ฐ„์ด ๊ฑฐ์˜ ์—†์ง€๋งŒ ๊ตฌํ˜„ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

์ข‹์€ ์†Œ์‹์ž…๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ•œ ๋ฒˆ ์ฐ”๋Ÿฌ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉด ์ •๋ง ์ข‹๊ฒ ๊ณ , ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์˜ ์†Œ์Šค๋ฅผ ํ•ดํ‚นํ•˜๋Š” ๊ฒƒ์„ ์ฆ๊น๋‹ˆ๋‹ค. :+1:

์ง€๊ธˆ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Redis๋กœ ์ง๋ ฌํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

@taylorzane์„ ๊ณต์œ ํ•˜๋Š” ์žˆ์Šต๋‹ˆ๊นŒ ?

@slidenerd JSON ๊ฐœ์ฒด๋ฅผ ๋ณ‘ํ•ฉํ•œ ๋‹ค์Œ ๋ณ‘ํ•ฉ๋œ ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ’์„ 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 ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ์ˆ˜๋™์œผ๋กœ ์ง๋ ฌํ™”ํ•˜๊ณ  null ๋ฐ undefined๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋” ๋‚˜์€ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. Redis ๋ชจ๋“ˆ์ด๋ฏ€๋กœ ์ด๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฒ„์ „(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 ๋•๋ถ„์— ์™ธ๋ถ€ ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์„

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰