我使用Multer包进行上传。我必须在上传图片之前检查令牌。 .single()
没有问题。但是,当我想上传多个图片时,似乎没有req.body.token
。
*检查令牌功能:
_checkToken = (token) => {
return User.
findOne({'token':token},'_id')
.then((data) => {
if(data) return data._id.toString()
else return 'invalid'
})
}
*请求_checkToken():
let userId
checkRequest = (data) => {
return new Promise((resolve,reject)=>{
let token = data.token
if(token){
_checkToken(token).then((auth) => {
if(auth.length==24){
_userId = mongoose.mongo.ObjectID(auth)
resolve('valid')
}
else{
resolve('invalid')
}
}).catch(err => reject('invalid'))
}
})
}
* Multer diskStorage
var storage = multer.diskStorage({
destination: function (req, file, cb) {
checkRequest(req.body).then((check)=>{
if(check=='valid'){
let newPost = new Post()
newPostId = newPost._id
let dir = `./data/posts/${newPostId}`;
if (!fs.existsSync(dir)){
fs.mkdirSync(dir);
}
cb(null, dir)
}
else return false
})
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now())
}
})
var uploadImages = multer({ storage: storage }).single('image')
*路线
routes.post('/post', (req,res) => {
uploadImages(req,res,(err)=>{
if(err) res.send('error')
else{
if(newPostId){
// ...
let data = {
_id: newCampaignId,
// ...
}
Post.create(data).then((p)=>{
res.send('done')
})
}
}
})
})
当我使用.array('images')
代替.single('image')
时,似乎没有req.body.token
,因为_checkToken(token)
会返回invalid
。
答案 0 :(得分:1)
更改multer的使用情况,使其成为所需路由的中间件堆栈的一部分。您当前使用的multer仅提取文件信息,但不会处理req.body
。
let uploadImages = multer({storage})
routes.post('/post', uploadImages.array('images'), (req,res) => {
if(newPostId){
// ...
let data = {
_id: newCampaignId,
// ...
}
Post.create(data).then((p)=>{
res.send('done')
})
}
})