在我的nodejs
express
应用中,我使用body-parser
来读取json请求,使用multer
进行文件上传。我总是在json中发送一些信息,因为基于此,我需要知道是否允许用户上传。为了测试,我使用这个httpie
命令。
http -vf POST localhost:9090/upload file@test.txt 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']);
我真的想在multer
之前检查id,因为这样一来,未经授权的人就可以上传文件了,之后,当我可以检查这不应该发生时我需要删除它。如果我没有首先将请求传递给multer
,那会更容易。
答案 0 :(得分: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() ;
});