POST中的nodejs / express和二进制数据

时间:2013-12-10 19:21:55

标签: node.js express binary

我正在尝试将二进制数据发送到快速应用。只要我的值小于0x80,它就可以正常工作。如果单个值为0x80或更大,则会混淆整个缓冲区。

Express Handler:

binary = require('binary');

exports.api = function(req, res){
    var body = req.body.name;
    var buf = new Buffer(body,'binary');

    console.log('body',req.body);
    console.log('req body len', body.length);
    console.log('buf len', buf.length);

    var g = binary.parse(buf)
        .word16bu('a') // unsigned 16-bit big-endian value
        .word16bu('b').vars

    console.log('g.a', g.a);
    console.log('g.b', g.b);

  res.send("respond with a resource");
};

Python客户端(Content-Type:application / x-www-form-urlencoded):

import requests
from struct import pack
# send two unsigned shorts (16-bits each).
requests.post('http://localhost:3000/api', data={'name':pack('!HH',1,2)})

数据= 1,2时的快速输出。 这是我期望的

body { name: '\u0000\u0001\u0000\u0002' }
req body len 4
buf len 4
g.a 1
g.b 2
POST /api 200 1ms - 23b

数据= 1,0xFF时的快速输出。有趣的是,9520实际上是十六进制的0x25 0x30,对应于ASCII中的“%0”。是的,它似乎正在解析'%00%01 ...'字符串。 我希望我知道如何防止这种情况!!!

body { name: '%00%01%00%FF' }
req body len 12
buf len 12
g.a 9520
g.b 12325
POST /api 200 2ms - 23b

2 个答案:

答案 0 :(得分:4)

原来是一个编码问题。一切似乎都默认为“utf8”,但在这种情况下,它需要设置为“二进制”。

例如:

var buf = new Buffer(body.toString('binary'),'binary');

同样重要的是,我需要将nodejs multiparty解析器的编码设置为' binary'。请参阅:https://github.com/superjoe30/node-multiparty/issues/37

答案 1 :(得分:0)

为此苦苦挣扎了很长时间之后,我想出了以下解决方案:

batch_action :unban do |ids|
AdminUser.find(ids).each do |v|
  v.update ban:true
end
redirect_to collection_path, alert: "The user has been unblocked"
end

bodyParser.raw用缓冲区填充req.body,其余代码来自:https://stackabuse.com/writing-to-files-in-node-js/