multer req.file возвращает неопределенное значение при загрузке - PullRequest
0 голосов
/ 23 апреля 2020

Я делаю простой Express сервер с аутентификацией и наталкиваюсь на дорогу, когда создаю форму для загрузки аватара при регистрации. Я хочу, чтобы пользователь мог при входе в систему вводить имя пользователя, адрес электронной почты, пароль и изображение, а также сохранять изображение на сервере и относительный путь к свойству объекта пользователя. Есть несколько сообщений на подобные проблемы, но я не могу найти, что не так с моим кодом.

Маршруты:

const passport = require('passport')
const router = express.Router()
const { ensureLoggedIn, ensureLoggedOut } = require('connect-ensure-login')

const multer = require('multer')
const Image = require('./../models/Image.model')
const upload = multer({ dest: './../public/uploads', storage: './../public/uploads' })

  '/signup',
  upload.single('avatar'),
  ensureLoggedOut(),
  (req, res) => {

    console.log(req.file)

    const avatarPath = `/uploads/${req.file.filename}`

    Image.create({
      name: req.file.originalname,
      path: avatarPath
    })

    passport.authenticate('local-signup', {
      successRedirect: '/profile',
      failureRedirect: '/signup',
      failureFlash: true,
    })
  }
)

Конфигурация паспорта:

  'local-signup',
  new LocalStrategy(
    { passReqToCallback: true },
    (req, username, password, avatarPath, next) => {
      const { email } = req.body

      bcrypt
        .hash(password, 10)
        .then((hash) => {
          return User.create({
            username,
            email,
            password: hash,
            avatar: avatarPath,
          })
        })
        .then((user) => next(null, user))
        .catch((err) => next(err))
    }
  )
)

HTML:

        <div class="form-group">
          <label for="username">Username</label>
          <input type="text" name="username" class="form-control">
        </div>
        <div class="form-group">
          <label for="email">Email</label>
          <input type="text" name="email" class="form-control">
        </div>
        <div class="form-group">
          <label for="password">Password</label>
          <input type="password" name="password" class="form-control">
        </div>
        <div class="form-group">
          <label for="avatar">Avatar</label>
          <input type="file" name="avatar" class="form-control" enctype="multipart/form-data">
        </div>
        <button type="submit">Signup</button>
      </form>```



1 Ответ

0 голосов
/ 23 апреля 2020

Не важно, я исправил это. Было несколько ошибок - во-первых, я должен был определить enctype в начале формы, например:

<form action="/signup" method="post" enctype="multipart/form-data">

, тогда как я должен вызвать Multer на маршруте POST чтобы загрузить файл, это промежуточное программное обеспечение Passport, которое принимает запрос. Если я сделаю console.log (req.file) там, он подхватится без проблем.

...