req.files возвращают неопределенные данные, пока req.body заполняется

Настройка:

  • Node.JS(v8.9.4)
  • Экспресс (v4.16.2)
  • Superagent v3.8.2(https://github.com/visionmedia/superagent) для POST от клиента
  • мультипликатор для загрузки файлов (v1.3.0)
  • Реагировать/Вавилон/Вебпак
  • CentOS 7, Vultr VPS
  • Ограничение размера файла увеличено до 50 МБ с nginx и multer.
  • Развернуто частным git (версия едина для всей платформы)

Симптом:

Когда смесь строковых данных JSON и изображения отправляется через HTTP-вызов POST, сервер получает случайное количество изображений через multer(multer.any()). Файл загружен и существует в общей папке сервера. req.body тоже в порядке, но почему-то я не могу получить доступ к req.files. он возвращает undefined. С heroku и локального хоста моего рабочего стола приложение работает нормально. Изображение загружено нормально, доступ к req.files данным также не вызывает проблем. Проблема только с сервером VPS/CentOS7.

Клиентская сторона (React/Superagent/Babel/Webpack)

import request from 'superagent'

request.post('/modwimg')
.query({
  //some token and other info goes here
})
.accept('application/json')
.field('data',JSON.stringify(jsonData))
.attach('image',this.state.imagedata)
.attach('bannerimage',this.state.bannerimagedata)
.then((res)=>{
  console.log('upload finished')
  this.setState({goback:true})
})
.catch((err)=>{

})

На стороне сервера

const bodyParser = require('body-parser')
const multer = require('multer')
const pubDir = path.join(__dirname, 'pub')
const storage = multer.diskStorage({
  destination: (req,file,cb)=>{
    cb(null,'pub/')
  },
  filename: (req,file,cb)=>{
    cb(null,Date.now() + file.originalname)
  }
})
const upload = multer({storage:storage})

//allowing public access, image goes to public dir
app.use('/pub', express.static(pubDir))

/* initialize bodyparser to build up RESTful app */
//file size limit expansion
app.use(bodyParser.urlencoded({limit:'50mb', extended:true}))
app.use(bodyParser.json({limit:'50mb'}))

app.post('/imageupload',upload.any(),(req,res,next)=>{
  //some token approval goes here
  console.log(req.files) // <----this returns undefined data, but image is still uploaded
  console.log(req.body) // <---- this is fine!!

  //putting data(JSON.parse(req.body)) to db
  db.any( //....
  )
  //then respond to client
  res.json({result:true})
})

person Sungryeol Park    schedule 06.03.2018    source источник
comment
Насколько я помню, req.files был удален из экспресса некоторое время назад.   -  person Michal Cholewiński    schedule 06.03.2018
comment
Я использую точно такую ​​же версию узла (последняя стабильная версия 8.9.4) и приложение как с Heroku/desktop, так и с моего VPS. Тогда почему он отлично работает на моем Heroku/рабочем столе? и поскольку приложение развертывается через git package.json, экспресс-версии практически одинаковы.   -  person Sungryeol Park    schedule 06.03.2018
comment
и я хотел бы знать: req.files больше не рекомендуется для получения файловых данных? тогда что я должен использовать для замены?   -  person Sungryeol Park    schedule 06.03.2018
comment
После поиска в Google о проблеме req.files undefined и ее замене люди действительно все еще используют «req.files», используя bodyParser и multer. Почему на других тестовых стендах он работает нормально, а на Linux нет?   -  person Sungryeol Park    schedule 06.03.2018


Ответы (1)


Задача решена. Я изменил параметр extended с app.use(bodyParser.urlencoded({limit:'50mb', extended:true})) на extended:false, теперь он работает как по волшебству. Я где-то читал, что опция extended для bodyParser переводит остальные данные http-запроса в какой-то другой формат, поэтому я изменил его, и теперь он работает.

person Sungryeol Park    schedule 06.03.2018