在我的nodejs
express
应用程序中,我使用body-parser
来阅读json请求和multer
进行文件上传。我总是在json中发送一些信息,因为基于此,我需要知道用户是否允许上传。为了测试,我使用这个httpie
命令。body-parser和multer阅读multipart + json
http -vf POST localhost:9090/upload [email protected] id=638381
请求通过多种中间件,但只有multer
后的中间件必须req.body.id
multer
之前,我得到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
,那将会更容易。
请记住,当上传大文件时,请求主体将以块的形式发送到服务器,它不会一次显示出来。 'multer'将在它们到达时读入这些片段,并将它们流式传输到一个文件中。如果你的请求体*中有其他内容,那么在文件读入之前,你将无法访问它,在许多情况下,客户端可能甚至不会发送那些较晚的文件,直到更早的文件已被消耗。您可以将'id'移动到URL或请求头部,而是在主体前接收。 – skirtle