Как я могу загрузить изображение после проверки пользовательских данных в express.js - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь создать профиль пользователя в express.js и MongoDB.Я использую Multer для загрузки изображений.Промежуточное ПО Multer всегда загружает изображение перед проверкой моих пользовательских данных.Если проверка пользователя не удалась, тем не менее изображение загружено.Но я хочу загрузить изображение после проверки пользовательских данных.Это означает, что я буду проверять пользовательские данные в контроллере, и, если они действительны, я буду загружать изображения и сохранять пользовательские данные в MongoDB.Как я могу это сделать?Заранее спасибо!

multerConfig.js

   exports.multerConfig = (multer) => {
        const storage = multer.diskStorage({
            destination: (req, file, cb) => {
                cb(null, './uploads/');
            },
            filename: (req, file, cb) => {
                cb(null, 'img-' + new Date().toISOString() + '-' + file.originalname);
            }
        });

    const fileFilter = (req, file, cb) => {
        (file.mimetype === 'image/png' || file.mimetype === 'image/jpeg' || file.mimetype === 'image/jpg') 
        ? cb(null, true) 
        : cb(null, false)
    };

    return multer({
        storage: storage,
        limits: { fileSize: 1048576 },
        fileFilter: fileFilter
    });
};

user.js (Маршруты)

const multer = require('multer');
const express = require('express');
const userController = require('../controllers/user');
const { multerConfig } = require('../utility/multerConfig');
const validateObjectId = require('../middleware/validateObjectId');
const asyncErrorHandler = require('../middleware/asyncErrorHandler');

const router = express.Router();
const upload = multerConfig(multer);

router.post('/', upload.single('image'), asyncErrorHandler(userController.createUser));

module.exports = router;

user.js (контроллер)

 const { User, validate } = require('../models/user');

const { deleteFile } = require('../utility/fileUtility');
const { failed, success } = require('../utility/utility');


exports.createUser = async (req, res) => {
    const { error } = validate(req.body);
    if (error) return res.status(400).send({ ...failed, message: error.details[0].message });

    const { name, address, mobile, email, password } = req.body;

    if (!req.file) return res.status(400).send({ ...failed, message: `you have to upload an image!` });

    const isUserExist = await User.find().or([{ mobile }, { email }]);
    if (isUserExist.length > 0) return res.status(409).send({ ...failed, message: `${name} is already exists!` });

    const image = req.file.path;
    const newUser = new User({ name, address, mobile, email, password, image });
    const savedUser = await newUser.save();

    if (!savedUser) return res.status(500).send({ ...failed, message: `user ${name} is failed to save!` });

    res.send({
        ...success,
        data: savedUser,
        message: `user ${name} is saved successfully`
    });
};

1 Ответ

0 голосов
/ 02 декабря 2018

Вы можете использовать два промежуточных ПО multer (одно для разбора текста, другое для загрузки файла).

Допустим, у вас есть форма с name (текстовое поле) и avatar (поле файла), вы можете сделать это:

var express = require('express');
var multer = require('multer');

var app = express();
var upload = multer({ dest: 'uploads/' });

app.post('/profile',
  upload.none(), function (req, res, next) {
    // validate `req.body.name` here
    // and call next(err) if it fails
    next();
  },
  upload.single('avatar'), function (req, res, next) {
    // file is now uploaded, save the location to the database
    res.end('done!');
  });

app.listen(9000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...