2015-09-27 67 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,如果你正在處理文件分成流。流是特定於環境的,但我的建議是處理一般的流。 –

相關問題