Как обновить массив моделей Mongoose? - PullRequest
0 голосов
/ 02 мая 2018

Я довольно новичок в программировании, поэтому я прошу прощения, если есть очень простой ответ на этот вопрос.

Я пытаюсь создать простой веб-сайт, где пользователи могут загружать несколько изображений, чтобы эти изображения отображались где-то еще на веб-сайте. Я делаю это с Mongoose, Express и Node. Я использую Multer в качестве промежуточного программного обеспечения для загрузки, и я также использую анализатор тела, который, как я слышал, может вызвать осложнения при использовании с Multer. Я использую Cloudinary API для загрузки и размещения загруженных изображений.

В идеале пользователь должен выбрать, какие изображения он хочет загрузить, эти изображения будут загружены в Cloudinary, тогда прямая ссылка на каждое изображение будет сохранена в модели Mongoose для этого конкретного поста, а затем каждое изображение будет отображаться с использованием ссылка на изображение, которое было сохранено.

Пока у меня все работает отлично, кроме одного вопроса. Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь вставить предоставленную ссылку для загруженного изображения в массив модели Mongoose, я получаю сообщение об ошибке и не могу найти обходной путь.

Вот код, куда изображения загружаются и помещаются в массив:

var imageLength;
var newImage = new Array();
router.post("/", isLoggedIn, upload.array("image"),function(req, res){
    image: [];
    imageLength = req.files.length;
    for(var i = 0; i < imageLength; i++){
        cloudinary.uploader.upload(req.files[i].path, function(result) {
            // add cloudinary url for the image to the campground object under image property
            newImage.push(result.secure_url);
            console.log(newImage[i-1]);
            console.log(req.body);
            req.body.campground.image.push(newImage[i-1]);
            console.log(req.body);
        });
    }

Вот модель Мангуста для "палаточного лагеря":

var mongoose = require("mongoose");

var campgroundSchema = new mongoose.Schema({
   name: String,
   image: [String],
   image_id: [String],
   description: String,
   author: {
     id: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User"
     },
     username: String
   },
   comments: [
      {
         type: mongoose.Schema.Types.ObjectId,
         ref: "Comment"
      }
   ]
});

module.exports = mongoose.model("Campground", campgroundSchema);

И вот ошибка, которую я получаю:

https://res.cloudinary.com/jpisani/image/upload/v1525280683/r1cs0zmjrznopot7lmu9.jpg
{ campground: 
   { name: 'g',
     description: 'g',
     author: { id: 5aaaf25986f338289129f8ea, username: 'frff' } } }
/home/ubuntu/workspace/YelpCamp/v10/routes/campgrounds.js:50
            req.body.campground.image.push(newImage[i-1]);
                                     ^

TypeError: Cannot read property 'push' of undefined

Как видите, изображение успешно загружено в Cloudinary, и у меня есть прямая ссылка на это изображение. Вопрос заключается в console.log(req.body);. В списке нет ни одного свойства изображения, которое мешает мне вставить ссылку в массив изображений.

Я понимаю, что req.body содержит только то, что было отправлено пользователем, но я не нашел решения этой проблемы каким-либо другим способом.

Вот код для создания новой страницы поста:

<div class="row">
    <h1 style="text-align: center">Create a New Campground</h1>
    <div style="width: 30%; margin: 25px auto;">
        <form action="/campgrounds" method="POST" enctype="multipart/form-data">
            <div class="form-group">
                <input class="form-control" type="text" name="campground[name]" placeholder="name">
            </div>
            <div class="form-group">
                <label for="image">Image</label>
                <input type="file" id="image" name="image" accept="image/*" multiple required>
            </div>
            <div class="form-group">
                <input class="form-control" type="text" name="campground[description]" placeholder="description">
            </div>
            <div class="form-group">
                <button class="btn btn-lg btn-primary btn-block">Submit!</button>
            </div>
        </form>
        <a href="/campgrounds">Go Back</a>
    </div>
</div>

Как вы можете видеть, часть загрузки этого кода (находится в центре) называется "image", что должно приводить к появлению массива изображений в модели Mongoose, когда я console.log(req.body);, но, похоже, этого не происходит .

Если какая-либо информация требуется, пожалуйста, спросите, я отвечу быстро. Любая помощь будет принята с благодарностью. Заранее спасибо.

Редактировать : Решение найдено! Для тех, кто сталкивается с этим в будущем, вот ответ на проблему.

//create - add new campground to DB
router.post("/", isLoggedIn, upload.array("campground[image]"), async function(req, res){
    // add author to campground
    req.body.campground.author = {
        id: req.user._id,
        username: req.user.username
    };

    req.body.campground.image = [];
    for (const file of req.files) {
        let result = await cloudinary.uploader.upload(file.path);
        req.body.campground.image.push(result.secure_url);
    }

    Campground.create(req.body.campground, function(err, campground) {
        if (err) {
            return res.redirect('back');
        }
        res.redirect('/campgrounds/' + campground.id);
    });
});

1 Ответ

0 голосов
/ 02 мая 2018

Ошибка в том, что в вашем req.body.campground.image нет доступного свойства image, то есть undefined, и вы пытаетесь push на неопределенное значение вместо массива в следующей строке

req.body.campground.image.push(newImage[i-1]);

попробуйте следующее:

req.body.campground.image = req.body.campground.image || [];
req.body.campground.image.push(newImage[i-1]);

Если свойство существует, то в любом случае присвойте ему пустой массив.

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