2017-10-05 61 views
0

在我的nodejsexpress應用程序中,我使用body-parser來閱讀json請求和multer進行文件上傳。我總是在json中發送一些信息,因爲基於此,我需要知道用戶是否允許上傳。爲了測試,我使用這個httpie命令。body-parser和multer閱讀multipart + json

http -vf POST localhost:9090/upload [email protected] id=638381 

請求通過多種中間件,但只有multer後的中間件必須req.body.idmulter之前,我得到req.body一個空的JSON訪問。

在下面的最小例子中,目前只有gridfsUpload可以看到id,但是如果我將multer上移或下移這個改變。

var http = require('http'); 
var express = require('express') 
var bodyParser = require('body-parser'); 
var argv = require('minimist')(process.argv.slice(2),{default:{port:8081}}); 
var multer = require('multer'); 

var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
    dir = __dirname+ '/tmp/' 

    cb(null, dir) 
    }, 
}) 

var app = express(); 

app.use(bodyParser.urlencoded({ extended: true,limit:'10mb' })); 
app.use(bodyParser.json({limit: '10mb'})); 

app.use((req,res,next) => { 


    console.log("body 1",req.body) 
    console.log("head 1",req.header) 
    next() 

    }) 


var gridfsUpload = function(options){ 
    return function (req, res, next) { 
    console.log("body 2",req.body) 
    console.log("head 2",req.header) 
     res.end() 


    } 
} 

var checkrole_measurement = (options) => { 
    return function (req, res, next) { 

    console.log("body 3",req.body) 
    console.log("head 3",req.header) 
    next() 

    } 
} 

app.post('/upload', 

       checkrole_measurement(), 
       multer({ storage: storage }).any(), 
       gridfsUpload(), 
     function(req,res,next){ 
          ; 
       } 
);  


var httpServer = http.createServer(app); 
httpServer.listen(argv['port']); 

我真的很想去檢查ID multer之前,因爲這樣的其他未授權的人可以上傳文件,後來,當我可以檢查,這不應該發生,我需要將其刪除。如果我只是沒有將請求首先傳遞給multer,那將會更容易。

+0

請記住,當上傳大文件時,請求主體將以塊的形式發送到服務器,它不會一次顯示出來。 'multer'將在它們到達時讀入這些片段,並將它們流式傳輸到一個文件中。如果你的請求體*中有其他內容,那麼在文件讀入之前,你將無法訪問它,在許多情況下,客戶端可能甚至不會發送那些較晚的文件,直到更早的文件已被消耗。您可以將'id'移動到URL或請求頭部,而是在主體前接收。 – skirtle

回答

0

有兩種方法可以做到這一點:

1:除了身體傳遞ID的它們傳遞到頭部。所以通過這種方式,你可以很容易地使用req.headers解析id:

2:而不是使用multer作爲中間件,你可以使用它作爲普通函數。 在這個方法中,body將被body-parser解析,文件將被multer上傳。

app.post('/upload',checkrole_measurement(), 
       gridfsUpload(), 
       function(req,res,next){ 
     multer({ storage: storage }).any() ;     
});