Не могу POST / изображения | MongoDB и Mongoose - PullRequest
0 голосов
/ 13 апреля 2020

Я разрабатываю проект с другом в NodeJS, и мы используем express, Пн goose, и при загрузке изображений на сервер он выдает нам эту ошибку: Cannot POST / images Здесь я оставляю код в Если кто-то может помочь мне, пожалуйста:

const fs = ('fs-extra');
const path = ('path');
const md5 = ('md5');

const ctrl = {};

const Image = require('../models/image.js');

ctrl.create = (req, res) => {
  const saveImage = async () => {
    const imgUrl = randomNumber();
    const images = await Image.find({ filename : imgUrl});
    if(images.length > 0) {
      saveImage()
    } else {
      const imageTempPath = req.file.path;
      const ext = path.extname(req.file.originalname).toLowerCase();
      const targetPath = path.resolve('/src/public/upload/${imgUrl}${ext}');

      if(ext == '.png' || ext == '.jpg' || ext == '.gif' || ext == '.jpeg') {
        await fs.rename(imageTempPath, targetPath);
        const newImg = new Image({
          filename: imgUrl + ext
        });
        const imageSaved = await newImg.save();
        res.redirect('/images/' + imageSaved.uniqueId);
      } else {
        await fs.unlink(imageTempPath);
        res.status(500).json({ error: 'Solo se permiten Imagenes'})
      }
    }
  };
  saveImage();
};

module.export = ctrl;

Это контроллер, который у меня есть для загрузки изображений, и это модель:

  const mongoose = require('mongoose');
const { Schema } = mongoose;
const path = require('path');

const ImageSchema = new Schema({
  filename: { type: String }
});

ImageSchema.virtual('uniqueId')
  .get(function () {
    return this.filename.replace(path.extname(this.filename), '');
  });

module.exports = mongoose.model('Image', ImageSchema); 

И, наконец, это маршрут, который я использую для загрузка изображений (помимо некоторых маршрутов, таких как вход в систему и регистрация пользователей):

const router = require('express').Router();
const passport = require('passport');
const multer = require('multer');
const path = require('path');
const fs = require('fs-extra');
const image = require('../controllers/image');

module.exports = app => {
  router.post('/images', image.create);
}

router.get('/', (req, res, next) => {
  res.render('index');
});

router.get('/signup', (req, res, next) => {
  res.render('signup');
});

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

router.get('/signin', (req, res, next) => {
  res.render('signin');
});

router.post('/signin', passport.authenticate('local-signin', {
  successRedirect: '/profile',
  failureRedirect: '/signin',
  failureFlash: true
}));

module.exports = router;

router.use((req, res, next) => {
  isAuthenticated(req, res, next);
  next();
});

router.get('/profile', (req, res, next) => {
  res.render('profile');
});

router.get('/logout', (req, res, next) => {
  req.logout();
  res.redirect('/');
});

function isAuthenticated(req, res, next) {
  if(req.isAuthenticated()) {
    return next();
  }

  res.redirect('/')
}

Я был бы очень признателен, если бы вы могли мне помочь. Спасибо.

1 Ответ

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

Вам необходимо использовать multer для сохранения изображений в MongoDB в соответствии с ЭТОЙ статьей.

Важным выводом здесь является то, что наш тип данных - Buffer, что позволяет нам сохранять наше изображение в виде данных в виде массивов.

const multer = require('multer');

mongoose.connect(‘url_here’);

const Item = new ItemSchema(
  { img: 
      { data: Buffer, contentType: String }
  }
);

const Item = mongoose.model('Clothes',ItemSchema);

app.use(multer({ dest: ‘./uploads/’,
 rename: function (fieldname, filename) {
   return filename;
 },
}));

app.post(‘/api/photo’,function(req,res){
 var newItem = new Item();
 newItem.img.data = fs.readFileSync(req.files.userPhoto.path)
 newItem.img.contentType = ‘image/png’;
 newItem.save();
});

Или следуйте этому посту. Сохранение изображения в MongoDB с использованием Node.js / Express и Пн goose

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