Я делаю простой 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>```