2015-03-31 30 views
0

我想使用JavaScript为Python RQ排队任务。为此,我只监视RQ用Redis做的事情。特别是它存储一个腌制列表,指示在哪里找到要运行的任务,包括输入参数等。这里我使用的是RQ主页上找到的示例。当存储下面的字符串(腌列表):Python RQ用JavaScript排队

'\x80\x02(X\x1c\x00\x00\x00my_module.count_words_at_urlq\x01NU\x0fhttp://nvie.comq\x02\x85q\x03}q\x04tq\x05.' 

使用JavaScript,它怪异的东西用文字\x80\x85。它用\xc2\x80\xc2\x85取代它们,我无法弄清楚为什么以及如何阻止这种行为。按照预期,该字符串的其余部分都汇集到Redis中。额外的文字妨碍了rqworker,更具体的腌菜,正常运行。

> encodeURI('\x80\x02(X\x1c\x00\x00\x00my_module.count_words_at_urlq\x01NU\x0fhttp://nvie.comq\x02\x85q\x03}q\x04tq\x05.') 
'%C2%80%02(X%1C%00%00%00my_module.count_words_at_urlq%01NU%0Fhttp://nvie.comq%02%C2%85q%03%7Dq%04tq%05.' 

> decodeURI('\x80\x02(X\x1c\x00\x00\x00my_module.count_words_at_urlq\x01NU\x0fhttp://nvie.comq\x02\x85q\x03}q\x04tq\x05.') 
' \u0002(X\u001c\u0000\u0000\u0000my_module.count_words_at_urlq\u0001NU\u000fhttp://nvie.comq \u0002q\u0003}q\u0004tq\u0005.' 

我正在使用节点和node_redis。

回答

0

找到了我自己的。 Python的pickle输出字符串实际上是二进制文件,这是使用Python编写和读取文件的常用方法。 Javascript不喜欢这样并“修复”它。解决方案是Javascript的缓冲区。

> new Buffer('\x80\x85', 'binary') 
<Buffer 80 85> 

> new Buffer('\x80\x85') 
<Buffer c2 80 c2 85> 

只给node_redis缓存对象,序列化对象的“正确”的代表将出现在Redis的和rqworker按预期工作。请记住,“二进制”模式正在被弃用。