2015-09-27 61 views
0

我试图通过Mongoose上传图像以存储在MongoDB上。NodeJS TypeError参数应该是Heroku上的一个缓冲区

我正在使用多方获取上传的文件。

代码工作100%完美的我的本地机器上,但是当我在Heroku上部署它,它给人的错误:

TypeError: argument should be a Buffer

这里是我的代码:

exports.create = function (req, res) { 
'use strict'; 

var form = new multiparty.Form(); 

form.parse(req, function (err, fields, files) { 
    var file = files.file[0], 
     contentType = file.headers['content-type'], 
     body = {}; 

    _.forEach(fields, function (n, key) { 
     var parsedField = Qs.parse(n)['0']; 

     try { 
      parsedField = JSON.parse(parsedField); 
     } catch (err) {} 
     body[key] = parsedField; 
    }); 
    console.log(file.path); 
    console.log(fs.readFileSync(file.path)); 

    var news = new News(body); 
    news.thumbnail = { 
     data: new Buffer(fs.readFileSync(file.path)), 
     contentType: contentType 
    }; 
    news.save(function (err) { 
     if (err) { 
      return handleError(res, err); 
     } 
     return res.status(201); 
    }); 
}); 
}; 

这是控制台登录上面的代码为HEROKU:

Sep 26 17:37:23 csgowin app/web.1: /tmp/OlvQLn87yfr7O8MURXFoMyYv.gif 
Sep 26 17:37:23 csgowin app/web.1: <Buffer 47 49 46 38 39 61 10 00 10 00 80 00 00 ff ff ff cc cc cc 21 f9 04 00 00 00 00 00 2c 00 00 00 00 10 00 10 00 00 02 1f 8c 6f a0 ab 88 cc dc 81 4b 26 0a ... > 

控制台登录我的LOCAL MACHINE:

C:\Users\DOLAN~1.ADS\AppData\Local\Temp\TsfwadjjTbJ8iT-OZ3Y1_z3L.gif 
<Buffer 47 49 46 38 39 61 5c 00 16 00 d5 36 00 bc d8 e4 fe fe ff ae cf df dc ea f1 fd fe fe db e9 f1 ad ce de 46 5a 71 2b 38 50 90 b8 cc 4a 5f 76 9a c3 d7 8f ... > 

Heroku是否需要任何设置或配置?

+0

什么是你的错误的堆栈跟踪?如果不知道它在哪里抛出,错误是无用的。 – hunterloftis

回答

1

当执行 data: new Buffer(fs.readFileSync(file.path))时,类似传递对象的声音不是缓冲区。可能是您的本地环境处理文件写入的差异,或者可能是多方处理流的方式。

此代码完美的作品对我来说:

news.thumbnail = { 
     media: fs.createReadStream(fileLocation), 
     contentType: contentType 
       }; 

但你也必须确保你的文件已经从上传保存之前,你可以在上面createReadStream方法使用的文件。事情与Node不一致,有时候会发生同步,有时不会发生。我使用Busboy来处理fileupload,因为它处理流并在文件流完成时创建一个处理程序。对不起,基于上述,我不能告诉你,你的问题是这样香港专业教育学院包括两种解决方案供您试用:))

打杂:https://www.npmjs.com/package/busboy 伊夫使用该文件已被上传到打杂temp目录后:

//Handles file upload and stores to a more permanent location.: 
    //This handles streams. 
    // request is given by express. 
    var busboy = new Busboy({ headers: request.headers }); 
    var writeStream; 
    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 
     writeStream = file.pipe(fs.createWriteStream(saveTo)); 
    }) 
    .on('finish', function() { 
     writeStream = file.pipe(fs.createWriteStream(saveTo)); 
     writeStream.on('close', function(){ 
     //use the file 
    }); 
    }); 
+0

当我按照你的第一个解决方案时,我得到这个错误: CastError:在缓冲区中的值为“[object Object]”的缓冲失败缓冲区“thumbnail.data” – Dolan

+0

我读过这篇文章:http://lollyrock.com/articles/express4 - 文件上传/和它把我关店busboy – Dolan

+0

不,你一定需要busboy,如果你正在处理文件分成流。流是特定于环境的,但我的建议是处理一般的流。 –

相关问题