如何从 Node.js 中的 $http 请求返回 ArrayBuffer?

lva*_*yut 6 javascript node.js angularjs

$http.post从 Angular.js 向 Node.js 发送了一个请求,以获得ArrayBuffer如下结果:

$http.post('/api/scholarships/load/uploaded-files', Global.user, {responseType:'arraybuffer'}).success(function(ab){
    console.log(ab); // Return ArrayBuffer {}
});
Run Code Online (Sandbox Code Playgroud)

然后,在 Node.js 中,我检索上传的文件数据并将Buffer对象转换为ArrayBuffer对象:

exports.loadUploadedFiles = function(req, res) {
    db.UserFile.findAll().success(function(files) {
        var buffer = files[0].dataValues.data; // Get buffer
        var arrayBuffer = new ArrayBuffer(buffer.length); // Start transforming Buffer to ArrayBuffer
        var views = new Uint8Array(arrayBuffer);
        for(var i = 0; i < buffer.length; ++i) {
            views[i] = buffer[i];
        }
        res.type('arraybuffer');
        res.send(arrayBuffer); // Send the ArrayBuffer object back to Angular.js
    }).error(function(err) {
        console.log(err);
        res.sendStatus(500);
    });
};
Run Code Online (Sandbox Code Playgroud)

当我尝试打印上面的响应时$http.post,我总是得到ArrayBuffer{}。我做错了什么?任何帮助,将不胜感激。

ekc*_*cr1 6

不需要在服务器端创建ArrayBuffer。事实上,只返回 Node.js 中的 Buffer 就可以了。ArrayBuffer 是客户端/浏览器端的一个概念,用于将来自服务器的数据解释为 ArrayBuffer。你得到“ArrayBuffer{}”的原因可能是因为node.js在res.send()上toString()'ing ArrayBuffer,因为它不理解该对象。所以试试这个

exports.loadUploadedFiles = function(req, res) {
    db.UserFile.findAll().success(function(files) {
        var buffer = files[0].dataValues.data; // Get buffer
        res.send(buffer);
    }).error(function(err) {
        console.log(err);
        res.sendStatus(500);
    });
};
Run Code Online (Sandbox Code Playgroud)