2017-10-05 33 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() ;     
});