
ã¯ã©ã€ã¢ã³ããšãµãŒããŒéã®çžäºäœçšã¯éåžžéåžžã«åçŽã§ãããããªãåå§çãªããŒã«ã«äŸåããŠããŸãã ããã¯ããèªäœã§ã¯åé¡ãåŒãèµ·ãããŸããããå€ãã®å Žåãã¿ã¹ã¯ã®å°ããªè€éãã§ããéåžžã®ã¢ãããŒãã«é©åãããããšãé£ããããšã¬ã¬ã³ããããªãããããœãªã¥ãŒã·ã§ã³ãçã¿åºããŸãã å€ãã®ã¿ã¹ã¯ã¯ãæ°ãããããžã§ã¯ãããšã«ãç¡èšç»ãã€çžäºã«ç¬ç«ããŠè§£æ±ºãããŸãã ãã®ãããªã¿ã¹ã¯ã«ã¯ãããšãã°æ¬¡ã®ãã®ããããŸãã
- ããããªã¯ãšã¹ã
- è€éãªããŒã¿æ§é ã®äžéšãšããŠã®æ¥ä»è»¢é
- ã«ã¹ã¿ã ããŒã¿åã®æå®
- ãµãŒããŒãå¿çã§è¿ãå¿
èŠãããåŸåŸ©ããŒã¿ã転éããŸã
- èŠæ±ãšå¿çã®ã¡ã¿ããŒã¿ãè¿œå ãã
- å¿çã®ãšã©ãŒåŠç
éçºè
ã¯å€ãã®æéãè²»ããããµãŒããŒåŽã§lotããã€ã¯ãäœåºŠãäœæããŸãããã®åŸãã¯ã©ã€ã¢ã³ãåŽã§ããµããŒãããå¿
èŠããããŸãã
jsonexã¯ãåŒã³åºãå¯èœãªããŒã¿ã®æŠå¿µã«åºã¥ããã·ã³ãã«ã§çµ±äžãããã¢ãããŒãã®ãã¬ãŒã ã¯ãŒã¯å
ã§ãäžèšã®åé¡ãšä»ã®å€ãã®åé¡ã®è§£æ±ºçãçµã¿åãããè©Šã¿ã§ãã
å
容
jsonexåŒã³åºãè¡šèšã³ã³ããã¹ãéä¿¡jsonexãšJSèšç®å¯èœãªããŒã¿ïŒåŒã³åºãå¯èœãªããŒã¿ïŒã¯ã©ã€ã¢ã³ãåŽã®ãã¥ãŒèšç®å¯èœãªããŒã¿ã®å©ç¹HTTPããã³Webãœã±ããã䜿çšããã»ãã¥ãªãã£ã«é¢ããèæ
®äºé
JSONè¡šçŸéåæåŒã³åºãã¢ãŒã¯ãããã«jsonex
èšç®å¯èœãªããŒã¿ã®æŠå¿µã¯åçŽã§ãããŸããŸãªããŒã¿åœ¢åŒã«äœ¿çšã§ããŸãã ããå°ãç§ã¯
JSONè¡šçŸã®ãã¬ãŒã ã¯ãŒã¯å
ã§ããã䜿çšããæ¹æ³ãæããŸãã ãããããã®ã¢ã€ãã¢ãæãçŽç²ãªåœ¢ã§ç€ºãããã«ãé ãããå§ããŸãããã
å€ãã®å ŽåãJSONã䜿çšããŸãããããã¯çŸããã§ãã ã·ã³ãã«ã§èªã¿ããããéå±€çãªããŒã¿æ§é ãè¡šãããšãã§ããåºããµããŒããããŠããŸãã ããã«ãããããããç§ã¯ããã€ãã®ããšãæ¹åããããšæããŸããäŸãã°ïŒ
- ã³ã¡ã³ããèš±å¯ãã
- æååã«ã¢ãã¹ãããã£ãèš±å¯
- èŸæžã®ããŒã®åŒçšç¬Šãçç¥ã§ããŸã
- èŸæžãšãªã¹ãã®æ«å°Ÿã®ã³ã³ããèš±å¯ãã
JSONã®æ¡åŒµããŒãžã§ã³ïŒjsonexãšåŒã³ãŸãããïŒã¯ãããšãã°æ¬¡ã®ããã«ãªããŸãã
{
ããæªããªãã JSON configsã§ã³ã¡ã³ããæžãæ©èœãããããæäŸããŸãã ãããããã®äŸã«ã¯éåžžã«çãããè¡ã1ã€ãããŸãã
dateOfBirth: '1901-01-01',
ããã¯äœã§ãã ã²ãïŒ æ¥ä»ïŒ 人ã¯æèããæšæž¬ã§ããŸãããããŒãµãŒã¯ããã»ã©è³¢ãã¯ãããŸããã 圢åŒã§æäŸãããªãæ¥ä»ã¿ã€ãã ãããèªèããããã«ã2ã€ã®ã¢ãããŒãã䜿çšã§ããŸããããŒã¿ã¹ããŒã ãèšè¿°ããããããŒãµãŒãæ£ããæ¹åã«å°ãããšãã§ããäœããã®çš®é¡ã®ãã³ãã¢ãããŒã·ã§ã³ã䜿çšããŸãã
JSONã¯æåã¯ã¹ããŒã ãå¿
èŠãšããŸãããæ¥ä»ãã©ã®ãã£ãŒã«ãã«ããããããŒãµãŒã«äŒããããšãã§ããããã«ããããã ãã«ããã®ååšãèŠæ±ããã®ã¯å¥åŠã§ãã ãããã£ãŠã2çªç®ã®æ¹æ³ã«é²ã¿ãŸãããã æ¥ä»ã«æ³šéãè¿œå ããå€ãã®æ¹æ³ãèããããšãã§ããŸãããä»»æã®ããŒã¿åã瀺ãç°¡åã§åæã«æ®éçãªæ¹æ³ããããšäŸ¿å©ã§ãã ããã«ã¯åŒã³åºãè¡šèšãæé©ã§ãã
åŒã³åºãè¡šèš
次ã®ããã«ãã£ãŒã«ããèšè¿°ããŸãã
dateOfBirth: Date('1901-01-01'),
ããã§ãããŒã¿åãæããã«ãªããŸããã ããããããŒãµãŒã¯ãã®ãããªã¬ã³ãŒãã«ééãããšãã«æ£ç¢ºã«äœããã¹ãã§ããããïŒ ã¢ãããŒãã¯ããªãç°¡åã§ãã
SomeName(args...)
ãšãã圢åŒã®æ§ç¯ã«ééãã
SomeName(args...)
ããŒãµãŒã¯æ¬¡ã®ããšãè¡ãå¿
èŠããããŸãã
SomeName
ãšããååã®äºåå®çŸ©ããããã³ãã©ãŒé¢æ°ããã³ã§æ€çŽ¢ããŸãargs...
åŒæ°ã§ãã®é¢æ°ãå®è¡ããŸãargs...
- å
ã®èšèšã®ä»£ããã«ãåŠçãããããŒã¿ã§å®è¡çµæã䜿çšãã
ãããã£ãŠãåæã®çµæã¯ããã³ãã©ãŒé¢æ°ã®å®è£
ã«å®å
šã«äŸåããŸãã
Date('1901-01-01')
åŒã³åºã
Date('1901-01-01')
ã¯ãJavaScriptã§ã¯
Date
åãPythonã§ã¯
date
ãŸãã¯
datetime
ãªã©ã®ãªããžã§ã¯ãã«å€ãããŸãã
ããŒãµãŒãæå®ãããååã®ãã³ãã©ãŒãèŠã€ããããªãå Žåãããã©ã«ãã®ãã³ãã©ãŒãåŒã³åºããŸãããã®ãã³ãã©ãŒã¯ã劥åœãªãã®ãè¿ãããäŸå€ãã¹ããŒããŸãã
åŒã³åºãè¡šèšã®åŠçäžã«ãããŒã¿ã«å«ãŸããä»»æã®ã³ãŒããå®è¡ããããã«èŠãããããããŸããããããã§ã¯ãããŸããã
- ããŒã¿ã¯ããŒã¿ã®ãŸãŸã§ãããåŠçã®å¶åŸ¡ã¯å®å
šã«åœââ瀟ã«ãããŸã
- ããŒãµãŒã¯ãæ瀺çã«å®çŸ©ããããã³ãã©ãŒä»¥å€ã®é¢æ°ã䜿çšã§ããŸãã
- ãã³ãã©ãŒé¢æ°ã¯ãã¹ãŠåœç€Ÿã«ãã£ãŠå®çŸ©ãããŠãããã¢ã¯ãã£ããªã¢ã¯ã·ã§ã³ãå®è¡ããåã«äºåãã§ãã¯ãå®è¡ã§ããŸãã
ããã«ããããã®ãã€ã³ãããã詳现ã«æ€èšããŸãã ãããŸã§ã®éãåŒã³åºãè¡šèšæ³ã¯éåžžã«æè»æ§ãé«ãããšã«æ³šæããŠãã ããã æ°ãããã³ãã©ãŒãè¿œå ããããšã«ãããã·ã¹ãã ãç°¡åã«æ¡åŒµã§ããŸãã
var handlers = { Date: function (ctx, v) { return new Date(v); }, Complex: function (ctx, real, imag) { return new Complex(real, imag); }, ArrayBuffer: function (ctx, v) { return base64DecToArr(v).buffer; }, Person: function (ctx, personDataDict) { return new Person(personDataDict); } };
ããã§ã¯ãbase64è¡šçŸã®æ¥ä»ãè€çŽ æ°ããã€ããªããŒã¿ã解æããæ©èœãè¿œå ããŸãããããããã¹ãŠã¯æåéãæ°è¡ã®ã³ãŒãã§ãããä»®æ³ããŒãµãŒã®æ§é ãå®å
šã«å€æŽããããšã¯ãããŸããã
ã³ã³ããã¹ã
ã芧ã®ãšãããåãã³ãã©ãŒã¯ãç¬èªã®åŒæ°ã«å ããŠã
ctx
ãã©ã¡ãŒã¿ãŒãåãå
¥ããŸãã ãã®ãã©ã¡ãŒã¿ãŒã¯åŠçã³ã³ããã¹ããæž¡ããŸãã ãã®æ®µéã§ã¯ã
ctx
ã¯æåã¯ç©ºã®èŸæžã§ãããšæ³å®ããŠããŸãã ã³ã³ããã¹ãã«ããã次ã®ããšãã§ããŸãã
- ãã³ãã©ãŒãäºãã«ãéä¿¡ãã§ããããã«ããŸã
- ããã€ãã®èšå®ããã³ãã©ãŒã«æž¡ã
- å€éšç°å¢ãããã³ãã©ãŒã«è¿œå ããŒã¿ãæž¡ã
- 解æäžã«åãåã£ãè¿œå æ
å ±ãä¿åãã
ããšãã°ãã³ã³ããã¹ãã䜿çšãããšã以åã«èšç®ããããªããžã§ã¯ãã䜿çšã§ãã
get
ããã³
set
ãã³ãã©ãŒãç°¡åã«äœæ
get
ãŸãã
var handlers = {
éä¿¡jsonexãšJS
JSONãšåæ§ã«ãjsonexã¯JSæ§æãšå¯æ¥ã«é¢é£ããŠããŸãã ããã¯æ§æçã«æ£ããJSåŒã§ãããæãåçŽãªã±ãŒã¹ã§ã¯ãååŒã³åºãè¡šèšãèšç®ã®ã³ã³ããã¹ãã§å®çŸ©ãããŠããã°ãJSåŒãšããŠè©äŸ¡ããããšããã§ããŸãã äŸãã°
[ foo(), bar.baz()
foo
ãš
bar
æ£ããå®çŸ©ãããŠããã°ãæå¹ã§èšç®å¯èœãªJSåŒã§ãã
ãã¡ãããããã¯ã察å¿ããã¯ããŒãžã£ãŒã§å¿
èŠãªå€æ°ãå®çŸ©ããããšã«ããã
eval()
ã䜿çšããŠjsonexãååŸããã³è©äŸ¡ãã䟡å€ããããšããæå³ã§ã¯ãããŸããã æœåšçãªã»ãã¥ãªãã£ã®åé¡ã«å ããŠããã®ã¢ãããŒãã¯ãå®è¡äžã®äœããšããŠã§ã¯ãªããããŒã¿ãšããŠããŒã¿ãæ£ç¢ºã«åæããããšãå¯èœã«ããæè»æ§ã®äžéšã倱ããŸãã ãã ããå Žåã«ãã£ãŠã¯ãjsonexã¯å®éã«ã¯JSã®éå®ããããµãã»ãããšèŠãªãããjsonexããŒã¿ã¯JSåŒãšèŠãªãããŸãã
èšç®å¯èœãªããŒã¿ïŒåŒã³åºãå¯èœãªããŒã¿ïŒ
jsonexã®ããŒã¿ã¯èšç®å¯èœãªåŒã§ãèšç®åãŸãã¯èšç®ããã»ã¹ã§ç°¡åã«è§£æã§ããŸãã ãã®ãããªåŒããµãŒããŒèŠæ±ãšããŠäœ¿çšããªãã®ã¯ãªãã§ããïŒ ããšãã°ãã¯ãšãªã¯æ¬¡ã®ããã«ãªããŸãã
getUsers([1, 15, 7])
ãµãŒããŒã¯ãé©åãªãã³ãã©ãŒã䜿çšããŠèšç®ã§ããŸãã
var handlers = { getUsers: function (ctx, userIds) { var listOfUsers = getUsersFromDbOrWhatever(userIds); return listOfUsers; } };
次ã«ãçµæãjsonexã§ã·ãªã¢ã«åããå¿çãã¯ã©ã€ã¢ã³ãã«éä¿¡ããŸãã
[ User({id: 1, name: 'John', ...}), ...]
ã¯ã©ã€ã¢ã³ãã¯ã䜿çšã§ããç¶æ
ã®æ£çŽãªãªããžã§ã¯ããå«ãããŒã¿ãåãåããŸãã åæã«ããµãŒããŒã¯jsonexåŒã®åçŽãªèšç®æ©ã«ãªããŸãã APIãæ¡åŒµããã«ã¯ãæ°ãããã³ãã©ãŒãè¿œå ããã ãã§ååã§ããURLãå°ç¡ãã«ããããåŒæ°ã解æããããé©åãªåã«ãã£ã¹ãããããGETãšPOSTãåºå¥ãããããå¿
èŠã¯ãããŸããã
ã¯ã©ã€ã¢ã³ãåŽã®ãã¥ãŒ
ã¯ã©ã€ã¢ã³ãããã®é話ãæŽçããæ¹æ³ã«ã€ããŠèããŠã¿ãŸãããã
"getUsers([1, 15, 7])"
1ã15ã7
"getUsers([1, 15, 7])"
ãããªæååã®åœ¢åŒã§jsonexè¡šçŸãæåã§åéããã®ã¯äžäŸ¿ã§ãã ãããã£ãŠãåŒã³åºãè¡šèšãèšè¿°ããã·ãªã¢ã©ã€ã¶ãŒãç解ãããã«ããŒãªããžã§ã¯ããå¿
èŠã§ãã ããã¯ããã®äœ¿çšæ¹æ³ã®äŸã§ãã
var getUsers = function (userIds) { return new jsonex.Call('getUsers', userIds);
ãã®å ŽåããµãŒããŒãªã¯ãšã¹ãã¯æ¬¡ã®ããã«ãªããŸãã
server.ask( getUsers([1, 15, 7]),
server.ask()
ã¯æ¬¡ãå®è¡ããå¿
èŠããããŸãã
- jsonexã®æåã®åŒæ°ãæå¹ã«ãã
- ãµãŒããŒãªã¯ãšã¹ããšããŠéä¿¡ãã
- jsonexã®å¿çãåŸ
ã£ãŠè§£æãã
- çµæãã³ãŒã«ããã¯é¢æ°ã«éä¿¡ããŸã
ãã®äŸã§ã¯ãæåã®åŒæ°ã¯
getUsers()
ãè¿ãå€ãã€ãŸããæåå
'getUsers([1,15,7])'
ã·ãªã¢ã«åããã
jsonex.Call
åã®ãªããžã§ã¯ãã«ãªããŸãã
ã·ã³ãã«ã§ãããã«èŠããŸãã ã³ãŒããæžããšãã芳ç¹ããèŠããšããã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ããã«äœ¿çšã§ãããªããžã§ã¯ãã§å®è¡ãããå€æã¯ãã¹ãŠå
éšã«é ãããŠããŸãã ãã®äŸã§ã¯ã³ãŒã«ããã¯ã䜿çšããŠããŸãããPromiseã䜿çšãããšããã¹ãŠãããã«èŠããããªããŸãã
ãµãŒããŒããåãåã£ãçµæãErrorã¯ã©ã¹ã®åå«ã§ããå Žåã
server.ask()
ã¯ãµãŒããŒããšã©ãŒãè¿ãããšèŠãªãã察å¿ããåŒæ°ã§ã³ãŒã«ããã¯ãåŒãèµ·ãããŸãã 解æã®çµæã¯ãç®çã®ã¯ã©ã¹ã®ããã«äœ¿çšã§ãããªããžã§ã¯ãã§ããããããã®ã¢ãããŒããå¯èœã§ãã
ãããã£ãŠããšã©ãŒã«ã€ããŠã¯ã©ã€ã¢ã³ãã«éç¥ããã«ã¯ããµãŒããŒãé©åãªåŒã³åºãè¡šèšã䜿çšããŠå¿
èŠãªã¯ã©ã¹ã®ãªããžã§ã¯ããè¿ãã ãã§ååã§ãã ãã®å Žåãã¯ã©ã€ã¢ã³ãã¯ããã®è¡šèšæ³ãErrorããç¶æ¿ããã¯ã©ã¹ã®ãªããžã§ã¯ãã«çœ®ãæãããã³ãã©ãŒãå®è£
ããå¿
èŠããããŸãã
ãšã©ãŒã¡ãã»ãŒãžãå«ããµãŒããŒå¿çã®äŸïŒ
UnexpectedError('Error details message')
ãã³ãã©ãŒã®äŸïŒ
handlers.UnexpectedError = function(ctx, msg) { return new ServerError(msg);
èšç®å¯èœãªããŒã¿ã®å©ç¹
èšç®å¯èœãªããŒã¿ããåŸããããã®ïŒ
- 転éããããªããžã§ã¯ãã®ã¿ã€ããæå®ããæ©èœ
- æšæºåããããšã©ãŒåŠç-ç®çã®ã¿ã€ãã®ãªããžã§ã¯ããè¿ãã ã
- èŠçŽ ããšã«å®è£
ããããããèŠæ±
- ã¹ããã€ãããããªã¯ãšã¹ã-äžéšã®åŒã³åºãã®çµæã¯ãä»ã®åŒã³åºãã®åŒæ°ãšããŠäœ¿çšã§ããŸã
- åŸåŸ©ããŒã¿ãç°¡åã«è»¢é
- è¿œå æ
å ±ãäŒããã®ã¯ç°¡åã§ã-åŠçäžã«èæ
®ããå¿
èŠãããããä»ã®ããŒã¿ãšæ··åããªãããããŒãšã¡ã¿ããŒã¿
ããšãã°ãããããªã¯ãšã¹ãã¯æ¬¡ã®ããã«ãªããŸãã
[ getFoo(), getBar(1, 2, 3), ]
å¿çãšããŠã
getFoo()
ããã³
getBar()
ã®åŒã³åºãã®çµæãå«ãé
åãæ¥ãŸãã
ããèšç®ã®çµæãå¥ã®èšç®ã§äœ¿çšããŸãã
[ set('x', getUserBooks(17)),
çãã¯ãæ¬ã®ãªã¹ããšãããã®æ¬ã®èè
ã®ãªã¹ããæã€é
åã«ãªããŸãã
泚ïŒãã®äŸã§ã¯ã
getProps()
åŒã³åºãã¯æœåšçã«å±éºãªå¯èœæ§ããããããããå
¬éããããªãããããã£ã«æãå·®ã䌞ã¹ãèœåã瀺ããŸã-ãã®ãããªãã³ãã©ãŒã®å®è£
ã«ã¯æ³šæããŠãã ããã
åŸåŸ©ããŒã¿è»¢éïŒ
[ 137,
å¿çã¯ãçªå·137ã®é
åãš
someRequest()
ãåŒã³åºããçµæã«ãªããŸãã
泚ïŒå®éã«ã¯ã
someRequest()
åŠçäžã«äŸå€ãã¹ããŒãããå Žåã§ããããè€éãªæ§æã䜿çšããŠåŸåŸ©ããŒã¿ãè¿ãããããã«ããå¿
èŠããããŸãã
è¿œå ã®ããŒã¿è»¢éïŒ
last(
ããã§ã
metaInfo()
åŒã³åºãã¯ã³ã³ããã¹ãå
ã®äœããå€æŽããããè¿œå ã®ã¢ã¯ã·ã§ã³ãåŒãèµ·ãããããäœããã®åœ¢ã§åŠçã«åœ±é¿ãäžãããããŸããã
last()
ã¯æåŸã®åŒæ°ã®ã¿ãè¿ãããããã®æ»ãå€ã¯å¿çããŸããã
HTTPããã³Webãœã±ããã䜿çšãã
HTTPèŠæ±ã«ã¯ãã¡ã€ã³ããŒã¿ïŒèŠæ±æ¬æïŒã«å ããŠããã¹ãã¡ãœãããããã³ããããŒãå«ãŸããŸãã HTTPå¿çã«ã¯æ»ãã³ãŒããå«ãŸããŠããŸãã jsonexã䜿çšããå Žåããã¹ãŠã®ãªã¯ãšã¹ãã«åäžã®ãã¹ã䜿çšãããšäŸ¿å©ã§ããããã¯ãããããªã¯ãšã¹ããWebãœã±ãããšããåãããå Žåã«éåžžè¡ãããã®ãšåãæ¹æ³ã§ãã APIã¯ããŸããŸãªæ¹æ³ã§åæ£ã§ããŸãããããã¯ã»ãšãã©æå³ããããŸããã
HTTPã¡ãœããã¯å¿
èŠãããŸãããåãªã¯ãšã¹ãã«ã¯ãããŒã¿ã®åä¿¡ãŸãã¯å€æŽã®åŒã³åºããå«ããããšãã§ããããã§ãã ããã§ããããŸããŸãªHTTPã¡ãœããã®ãµããŒãã¯ããã©ãŠã¶ããããã·ãããã³ä»ã®HTTPã®äžçã§é©åã«åäœããããã«åœ¹ç«ã€ããå¿
èŠãªå ŽåãããããŸãã å®è£
ã¯ç°¡åã§ã-ãªã¯ãšã¹ãããã³ã¬ã¹ãã³ã¹ãªããžã§ã¯ããèšç®ã³ã³ããã¹ãã«è¿œå ããã ãã§ããã³ãã©ãŒã¯HTTPãããã³ã«ã®è€éããèæ
®ããããšãã§ããŸãã æ»ãã³ãŒãã«ã€ããŠãåãããšãèšããŸãã jsonexã³ã³ãã¥ãŒãã£ã³ã°ã®äžéšãšããŠã¯å¿
èŠãããŸããããHTTPç°å¢ãšã®é©åãªå¯Ÿè©±ã®ããã«ãæ£ããå
¬éãã䟡å€ããããŸãã
ããŒã¿èªäœã®è»¢éã«é¢ããŠã¯ãHTTPãªã¯ãšã¹ãã®æ¬æã§éä¿¡ãããå Žåããã¹ãŠãçŽ æŽãããã§ãã ã»ãšãã©ã®å Žåãjsonexãªã¯ãšã¹ãã«POSTã¡ãœããã䜿çšããã®ã劥åœãšæãããããããããªããŸãã ãã ããäœããã®ç®çã§GETãHEADããŸãã¯DELETEã䜿çšããå Žåã¯ãURLã®äžéšãšããŠããŒã¿ã転éããå¿
èŠããããŸããããã¯ãæšæºã«åŸã£ãŠãããã®èŠæ±ã®æ¬æãç¡èŠããå¿
èŠãããããã§ãã ãããè¡ãç°¡åã§å®äŸ¡ãªæ¹æ³ããããŸã-jsonexãqueryãªã©ã®åäžã®ã¯ãšãªæååãã©ã¡ãŒã¿ãŒã«æž¡ã
query
ã ãããã£ãŠããªã¯ãšã¹ã
getUsers([1,2,3])
ã¯ã¢ãã¬ã¹ãžã®åŒã³åºãã«å€ãããŸã
example.com/api?query=getUsers%28%5B1%2C2%2C3%5D%29
ã²ã©ãããã«èŠããŸãããããã¯å
éšAPIåŒã³åºãã§ããããããããã°ããã»ã¹ã§èŠãã®ã¯ããã°ã©ãã ãã§ãã ãã®ã¢ãããŒãã¯ãã¯ã©ã€ã¢ã³ãåŽã®ããã±ãŒãžåãšãµãŒããŒåŽã®ã¢ã³ããã¯ã®äž¡æ¹ãéåžžã«å®¹æã«ãããããJSON圢åŒã§ããŒã¿ã転éããããã«ãã䜿çšãããŸãã æãã¢ãã¬ã¹ããŸã æ¥ããããå Žåã¯ãããŒãã®äžã«ããããé ãããŒã«ãæžãã®ã¯ç°¡åã§ãã
HTTPããããŒãšjsonexæ©èœã®äž¡æ¹ã䜿çšããŠãã¡ã¿ããŒã¿ã転éã§ããŸãã
last( authToken('myAuthToken'),
Webãœã±ãããåã¡ãã»ãŒãžãšãšãã«ããããŒãéä¿¡ããéåžžã®æ¹æ³ããªãããããã®ãããªããŒã¿ãèŠæ±èªäœã«çµ±åããæ©èœã¯éåžžã«äŸ¿å©ã§ãã Webãœã±ããã®å ŽåãåŸåŸ©ããŒã¿ãæž¡ãæ©èœãšãåãªã¯ãšã¹ãã®ãã¹ãšã¡ãœãããæå®ããå¿
èŠããªãããšãéèŠã§ãã
HTTPã®å Žåããªã¯ãšã¹ãã®ã¹ãçæ§ãéèŠã§ãã ãã®ããããã£ã¯HTTPã¡ãœããã«ãã£ãŠæ±ºå®ãããŸããäžéšã®ã¡ãœããã¯mustçã§ããå¿
èŠããããä»ã®ã¡ãœããã¯ããã§ã¯ãããŸããã jsonexãªã¯ãšã¹ãã¯ãã¹ãçåŒã³åºããšéã¹ãçåŒã³åºãã®æ··åã§ããå¯èœæ§ããããããããã«ã€ããŠäœããè¡ãããšãã§ããã¡ã«ããºã ãå¿
èŠã§ãã ããšãã°ãã¹ãçæ§ãå¿
èŠãšãããã©ã°ãèšå®ããŠãåŒã³åºãã§ãã§ãã¯ã§ããŸãã
var handlers = { idempotent: function (ctx) { ctx.mustBeIdempotent = true; }, updateUser(ctx, userData) { if (ctx.mustBeIdempotent) { throw new NonIdempotentCallError('updateUser'); } ... } };
ãªã¯ãšã¹ãã®äŸïŒ
last( idempotent(), [ getUsers([1,2]), updateUser({id:1, ...})
ã©ã®åŒã³åºããiçæ§ã§ãããã¯ãAPIã®ããã¥ã¡ã³ãããæ確ã§ããå¿
èŠããããŸãããŸãã
idempotent()
ãåŒã³åºããšãè€éãªãªã¯ãšã¹ãã§å±éºãªãã®ã䜿çšãããŠããªããšãã確信ãåŸãããŸãã
ã»ãã¥ãªãã£ã«é¢ããèæ
®äºé
ãã³ãã©ãŒãäœæããå Žåããªã¯ãšã¹ãã§ã¯ãåŒæ°ãä»»æã®çµã¿åããã§åŒã³åºãããšãã§ããããšãèŠããŠããå¿
èŠããããŸãã ããã«ããã»ãã¥ãªãã£äžã®åé¡ãçºçããªãããã«ããã«ã¯ã次ã®å¶éã«åŸãå¿
èŠããããŸãã
- ãã³ãã©ãŒã¯ãã·ã¹ãã ã«å¯ŸããŠæœåšçã«å±éºãªã¢ã¯ã·ã§ã³ãå®è¡ããªãã§ãã ãã
- ãã³ãã©ãŒã¯åŒæ°ãæ€èšŒããæå³ããªã䜿çšãé²æ¢ããå¿
èŠããããŸãã
- ãã³ãã©ãŒã¯ãåŒæ°ã®ããŒã¿éã確èªããŠãåŠçãã±ããã®ãµã€ãºãé©åãªéã«å¶éããå¿
èŠããããŸã
- ã·ã¹ãã ããã®ãããªå¯èœæ§ãæäŸããå Žåããã³ãã©ã¯ã¢ã¯ã»ã¹æš©ã確èªããå¿
èŠããããŸãã
- ã¯ãšãªã®ç·èšç®éãå¶éããå¿
èŠããããŸã
æåŸã®æ®µèœã§ã¯ãèŠæ±å
šäœã«å¶éã課ããŠãããå¥ã®èæ
®ã«å€ããŸãã èŠæ±ã®è€éããå¶åŸ¡ããæãç°¡åãªæ¹æ³ã¯ãèšç®ããããšããã«èŠæ±ãèšç®ããç¹å®ã®ãããå€ãè¶
ããå Žåã«åæ¢ããããšã§ãã
handlers.expesiveCall = function (ctx, args...) { ctx.cost += calcCost(args...); if (ctx.cost > ctx.costThreshold) { throw new TooExpensiveError(); } ... } };
ã³ã¹ããèšç®ãããšãã¯ãåŒæ°ã転éããããŒã¿ã®æ§è³ªãšéãèšç®ã®è€éãã«å€§ãã圱é¿ããå¯èœæ§ããããããåŒæ°ãèæ
®ããå¿
èŠããããŸãã
å¥ã®ãªãã·ã§ã³ã¯ããªã¯ãšã¹ãå
šäœã®äºååæã§ãã ããã¯ããªã¯ãšã¹ããåãªãããŒã¿ã§ããããå¯èœã§ãã ããããè€éãªã¯ãšãªãåæããããšèªäœãå°é£ãªã¿ã¹ã¯ã«ãªãå¯èœæ§ãããããã®èšç®ã®è€éããç£èŠããå¿
èŠããããŸãã
å¥ã®ã¢ãããŒãã¯ããªãœãŒã¹ãžã®äººçºçã«å¶éãããã¢ã¯ã»ã¹ã§ãµã³ãããã¯ã¹ã§èšç®ãå®è¡ããããšã§ãã ç°å¢ã§ãããç°¡åãã€å®äŸ¡ã«è¡ãããšãã§ããå Žåãããã¯è¯ãéžæè¢ã§ãã
åããã³ãã©ãŒãåå¥ã«äœ¿çšãããšããã³ãã©ãŒã®çµã¿åãããéæã§ããªãå¹æãæœåšçã«æã€å¯èœæ§ãããããšãèŠããŠããããšãéèŠã§ãã ãã®äºå®ã¯æ°ããè
åšãé ããããããŸãããããããã¯ç°¡åã«åé¿ã§ããŸãã ãã³ãã©ãŒã®ãµãã»ãããä»ã®ãã³ãã©ãŒãšã®äºæããªãçµã¿åããã®ç¹ã§å¿é
ãªå Žåã¯ããã€ã§ãå¥åã®åé¢ãããã»ããã«å
¥ããããšãã§ããŸãã ãã®ã»ããã¯ãå¥ã®ã¢ãã¬ã¹ã§äœ¿çšå¯èœã«ããããå¿
èŠãªå¶éãå°å
¥ãããªã¯ãšã¹ãã«ç¹å¥ãªã¡ã¿ããŒã¿ãè¿œå ããããšã§ã¢ã¯ãã£ãåã§ããŸãã
極端ãªå Žåãå€æ°ã®ãã³ãã©ãŒãåå¥ã«ã®ã¿ããŸãã¯
Date()
éåžžã«ããªããã£ããªåŒã³åºããšçµã¿åãããŠäœ¿çšââããããšãèš±å¯ã§ããŸãã ãããã®ãã³ãã©ãŒã¯åºæ¬çã«ããªã¯ãšã¹ãã§è€æ°ã®åŒã³åºããèš±å¯ããªã䜿ãæ
£ããã¢ãã«ã«æ»ããŸãã èšç®å¯èœãªããŒã¿ã¯å€§ããªæ©äŒãæäŸããŸãããå¿
èŠã«å¿ããŠå¶éããã®ã¯ç°¡åã§ãã
JSONè¡šçŸ
ä»ããjsonexã䜿çšãããå Žåã1ã€ã®åé¡ãçºçããŸã-JSONãšã¯ç°ãªããé«æ§èœjsonex解æããã³ã·ãªã¢ã«åã©ã€ãã©ãªãŒã¯ãæ§ããã«èšã£ãŠãããŸã ããã»ã©åºãå©çšã§ããŸããïŒããããæãéããããŸã-JSONè¡šçŸã«åºã¥ããŠjsonexã䜿çšã§ããŸãã jsonexã¯ã3ã€ã®åçŽãªã«ãŒã«ãé©çšããããšã§JSONã«å€ãããŸãã
æåã®ã«ãŒã«ã¯ãJSONè¡šçŸã§åŒã³åºãè¡šèšãèšè¿°ããæ¹æ³ã瀺ããŠããŸãã ããã«ãããããã£ãïŒããæã€èŸæž ç¹å¥ãªæå³ãç²åŸããŸãã 2çªç®ã®ã«ãŒã«ã¯ãããããã£ãïŒãã䜿çšããŠéåžžã®èŸæžãäœæããæ¹æ³ã®è³ªåã«çããŸãã åŒã³åºãè¡šèšãšæ··åããªãããã«ã 3çªç®ã¯æ§æç³ã§ããããã¯ãåäžã®åŒæ°ãããããã®åŒæ°ãèŸæžã§ããå Žåã®ç¹å¥ãªåœ¢åŒã®è¡šèšæ³ã§ãã jsonexã®ããŒã¿ãšJSONè¡šçŸã®ããŒã¿ã®äŸã次ã«ç€ºããŸãã
Person({
JSONè¡šçŸïŒ
{ "?": "Person", "name": "John", "dateOfBirth": {"?": ["Date", "1901-01-01"]}, "i": {"?": ["Complex", 0, 1]}, "d": {"?": ["?", 123]} }
JSONè¡šçŸã¯ããè€éã«èŠããŸãããåãããšã瀺ããŠããŸãã æšæºã®
JSON.parse()
ã§
JSON.parse()
ãã2åç®ã®ãã¹ã§è¿œå ã§ããŸãã ãŸãã¯ãããã€ãã®åçŽãªã±ãŒã¹ã§ã¯ã
JSON.parseïŒïŒã«æž¡ããã
reviveré¢æ°ã䜿çšããŠã解æäžã«çŽæ¥èšç®ã§ããŸãã JSONè¡šçŸã§ã®ã·ãªã¢ã«åã«ã€ããŠãåãããšãèšããŸã
ãJSON.stringifyïŒïŒã«æž¡ãããreplaceré¢æ°ã䜿çšãããšç°¡åã§ãã
äžè¬çã«ãèšç®å¯èœãªããŒã¿ã®æŠå¿µã¯ãã»ãšãã©ãã¹ãŠã®ããŒã¿åœ¢åŒã®æ¡åŒµæ©èœãšããŠè¿œå ã§ããŸãã
éåæåŒã³åºã
åã«ç€ºããäŸã§ã¯ããã¹ãŠã®åŒã³åºããåæçã§ãããšæé»çã«èããããŠããŸããã ãããã®1ã€ãããå¯æ¥ã«æ€èšããŠãã ããã
[ set('x', getUserBooks(17)), getAuthors(getProps(get('x'), 'authorId')), ]
getUserBooks()
ããã³
getAuthors()
ã¯ãããããããçš®ã®ããŒã¿ã¹ãã¢ã«ç§»åããI / Oã䜿çšããããã«å¿ããŠéåæã«ããå¿
èŠããããŸãã ãã®ããããã®å Žã§ããããèšç®ããããšã¯ã§ããŸããã ãŸããïŒããšãã°ã
ãã¡ã€ããŒã䜿çšããŠïŒã§ããå Žåã§ãã次ã
ã«ã§ã¯ãªããç¬ç«ããéåæåŒã³åºãã䞊è¡ããŠè¡ãããšãã§ããŸãã
ãœãªã¥ãŒã·ã§ã³ã¯ãå®è¡ã®ããã«éåæåŒã³åºãããã¥ãŒã«å
¥ããé©åãªå Žæã§çµæã眮ãæããã³ã³ãã¥ãŒãã£ã³ã°ãšã³ãžã³ã«ããããšãã§ããŸãã
次ã«ããã¹ãŠã®åæéšåãèšç®ããåŸãéåæéšåãå®äºããã®ãåŸ
ã¡ããã®åŸèšç®ã®æºåãã§ãããšèããŸãããå®è¡ã®ãã¥ãŒãšããŠãasync.queueïŒïŒã®ãããªãã®ã䜿çšããŠãæå®ãããã¬ãã«ã®äžŠååŠçã§ã¿ã¹ã¯ãå®è¡ã§ããŸããããããå®éã«ã¯ã¿ã¹ã¯ã¯ããè€éã§ãããã®äŸã§ã¯ãäžéšã®åŒã³åºãã®èšç®ã¯ä»ã®åŒã³åºãã«äŸåããŠãããèšç®ããset()
ãŸã§èšç®ã§ããŸããgetUserBooks()
ããããã£ãŠããåŒã³åºãããšãããšset()
ããã®èšç®ã延æãããããäŸåãããã¹ãŠã®èšç®ã«å¯ŸããŠãæºåãã§ãããããã«ãè¿œå ããå¿
èŠãããããšã瀺ãå¿
èŠãããset()
ãŸããããã§ã¯ã1ã€ã®é
延èšç®ã«getUserBooks()
äŸåããŠããŸãããããè€éãªäŸåé¢ä¿ãå¯ââèœã§ããããããããã ãã§ã¯ãããŸããã
åŒã³åºãã¯ãget()
å®äºãããŸã§æçšãªãã®ãè¿ãããšãã§ããŸããset()
ããããã£ãŠãget()
é
延èšç®ã«ããªããä»åã¯ããã®ä¿¡å·ãåŸ
æ©ãset()
ãŸãã次ã«ãã«getProps()
äŸåããŸããget()
ãã«getAuthors()
äŸåãgetProps()
ãŸããã³ã³ãã¥ãŒãã£ã³ã°ãšã³ãžã³ã¯ãããããã¹ãŠã®äŸåé¢ä¿ãèæ
®ãããã¹ãŠã®ä¿çäžã®èšç®ãæ£ããé åºã§å®è¡ããå¿
èŠããããŸããããã¯éåžžã«åçŽãªã¿ã¹ã¯ã§ã¯ãªãããã§ãã®ã§ããã®ã¢ãããŒããæ©èœããããšã蚌æããå®è£
ãå¿
èŠã§ããã¢ãŒã¯
arcãããžã§ã¯ãã¯ãéåæãã³ãã©ãŒãšäŸååŒã³åºãã䜿çšããå Žåãå«ããèšç®å¯èœãªããŒã¿ã®æŠå¿µãå®è¡å¯èœã§ããããšã瀺ãããã«äœæãããŸããããšã³ãžã³èªäœã¯éåžžã«ã·ã³ãã«ã§ãæ°çŸè¡ã®ã³ãŒãã§æ§æãããŠãããçŸæç¹ã§ã¯ããªãããŒãªæé©åãå«ãŸããŠããªããããéåžžã«ç解ãããããªã£ãŠããŸãããšã³ãžã³ã®ãœãŒã¹ããŒã¿ã¯ããŒã¯ã³ã®ã¹ããªãŒã ã§ããçŸåšãããŒã¯ã³åã¯JSONè¡šçŸã§ã®ã¿äœ¿çšã§ããŸãããjsonexãçŽæ¥æäœããããšã¯éè¿ã§ããarcã¯ãnode.jsãšbrowserifyã䜿çšãããã©ãŠã¶ãŒã®äž¡æ¹ã§äœ¿çšã§ããŸãã arcã®éåæãã³ãã©ãŒã®äœæã¯éåžžã«ç°¡åã«èŠããŸããéåæåŒã³åºããé©åãªãã£ã¬ã¯ãã£ãã§ã©ããããã ãã§ããšã³ãžã³ã¯å
éšã§ãã¹ãŠã®ããŒãã¯ãŒã¯ãå®è¡ããŸãã handlers.getUserBooks = function (ctx, userId) { return ctx.async(function (cb) { doSomethingAsync(...args, cb); }); };
ã³ãŒã«ããã¯ã®ã¿ããµããŒããããŠããŸãããPromiseãµããŒããèšç»ãããŠããŸãããšã³ãžã³ã®äœ¿çšäŸãããã³jsonexã§ã®ã·ãªã¢ã«åãšJSONè¡šçŸã®äŸã¯ã察å¿ããã»ã¯ã·ã§ã³ã«ãããŸããè£è¶³é©ããããšã«ãæåéããèšäºãæ²èŒãããŠããæ°æéåŸã«ãã¢ãŒã¯ã«ã¯ä»£æ¿æ段ããããŸããã Habrauser mayorovpã¯ãjsonexãJSONè¡šçŸã§è§£æããããã®ã©ã€ãã©ãªã®ããŒãžã§ã³ãæ瀺ããŸããããã®ããŒãžã§ã³ã®ã©ã€ãã©ãªã¯åäžã®ãã¡ã€ã«ã§æ§æãããäŸåé¢ä¿ã¯ãªããæšæºã®ãã¡ã€ã«ã䜿çšããA + promiseJSON.parse()
ããµããŒãããŠããŸããæ®å¿µãªããå¶éã®ããJSON.parse()
ããã®å®è£
ã§ã¯ãéåæåŒã³åºãã®åŠçã¯ããã»ã©å¹ççã§ã¯ãªããããåæãããŸããjQueryã§ä»£æ¿ã©ã€ãã©ãªã䜿çšããäŸã次ã«ç€ºããŸãã var parser = new JSONEX.parser({ allow_async: true, functions: { Foo: function() { var result = $.Deferred(); setTimeout(function() { result.resolve("Hello, world!"); }, 1000); return result.promise(); } }}); $.when(parser.parse('[{"?": ["Foo"]}]')) .done(function(result) { console.log(result); });
ãããã«
jsonexãšarcã¯çŸåšéçºäžã§ãããã®èšäºã§èšåããjsonexã®æ©èœã¯ããããå€æŽãããŸããããåå空éããã€ããªãã£ã³ã¯ãã¹ããªãŒã ãã¹ã³ãŒããªã©ã®æ°ããæ©èœãè¿œå ãããŸããã¢ãŒã¯ã¯ããªãå€åããå¯èœæ§ããããŸããæ瀺ãããã¢ã€ãã¢ã®ç®æ°ãããšéããŒãªã³ã°ã®æ§è³ªã®ãããããçšåºŠã®æ³šæãæã£ãŠãããã䜿çšããããšããå§ãããŸããããã§ããããªãããããã®ããã€ãã奜ãã§ãããªãã®ãããžã§ã¯ããšå®éšã§åœ¹ã«ç«ã€ãªãã°ãç§ã¯éåžžã«ããããã§ãããŸããææ³ãçµéšãçºèŠãå
±æããŠããã ããã°å¹žãã§ãã