【问题标题】:NodeJS TypeError argument should be a Buffer only on HerokuNodeJS TypeError 参数应该是仅在 Heroku 上的 Buffer
【发布时间】:2015-12-24 13:00:49
【问题描述】:

我正在尝试通过 Mongoose 上传图像以存储在 MongoDB 上。

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

代码在我的本地机器上 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 ... > 

这是我本地机器上的控制台日志:

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 需要任何设置或配置什么的吗?

【问题讨论】:

  • 您的错误的堆栈跟踪是什么?如果不知道它是在哪里抛出的,这个错误是没有用的。

标签: node.js heroku file-upload upload


【解决方案1】:

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

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

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

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

服务员:https://www.npmjs.com/package/busboy 在文件上传到 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
    });
  });

【讨论】:

  • 我在遵循您的第一个解决方案时收到此错误:CastError: Cast to buffer failed for value "[object Object]" at path "thumbnail.data"
  • 我读到了这个:lollyrock.com/articles/express4-file-upload,它让我远离了杂工
  • 不,如果您正在处理拆分为流的文件,您肯定需要 busboy。流是特定于环境的,但我的建议是一般处理流。
  • 我最终决定将我的文件存储在 AWS S3 中,它更便宜也更容易:)
  • @Dolan 切换到 AWS 是否解决了您的问题?你在本地运行什么服务器,你在 AWS 上运行什么服务器?
猜你喜欢
  • 2022-06-11
  • 2019-01-01
  • 1970-01-01
  • 2021-01-04
  • 2020-09-04
  • 1970-01-01
  • 2021-11-28
  • 2020-09-25
  • 1970-01-01
相关资源
最近更新 更多