NodeJS TypeError参数应该只是Heroku上的Buffer

时间:2015-09-27 00:42:40

标签: node.js heroku file-upload upload

我正在尝试通过Mongoose将图像上传到MongoDB上。

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

代码在我的本地计算机上100%完美运行,但是当我在Heroku上部署它时,它会出错:

super

这是我的代码:

TypeError: argument should be a Buffer

这是HEROKU上面代码中的控制台日志:

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);
    });
});
};

控制台登录我的LOCAL MACHINE:

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 ... > 

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

1 个答案:

答案 0 :(得分:1)

听起来传递的对象不是缓冲区  data: new Buffer(fs.readFileSync(file.path))已执行。可能是本地环境处理文件写入的方式不同,也可能是多方处理流的方式。

这段代码对我来说完美无缺:

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

但是您还必须确保您的文件已从上传中保存,然后才能使用上述createReadStream方法中的文件。事情与Node不一致,有时这种情况同步发生,有时不发生。我使用Busboy来处理文件上传,因为它处理流并在文件流完成时创建一个处理程序。对不起,基于以上情况,我不能告诉你你的问题在哪里,所以我已经为你提供了两个解决方案:))

Busboy:https://www.npmjs.com/package/busboy 我已经将文件上传到busboy中的临时目录后使用了这个:

    //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
    });
  });