代码之家  ›  专栏  ›  技术社区  ›  Dolan

NodeJS TypeError参数只能是Heroku上的Buffer

  •  0
  • Dolan  · 技术社区  · 9 年前

    我正在尝试通过Mongoose上传一张图片存储在MongoDB上。

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

    代码在我的本地机器上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需要任何设置或配置吗?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Jimmy Scray    9 年前

    听起来传递的对象不是缓冲区 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的临时目录后使用了这个:

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