Получение ValidationError в mon goose при попытке записи нового или обновления моего mongoDB на mlab - PullRequest
0 голосов
/ 30 января 2020

Я получаю ошибку проверки на моем маленьком сайте, связанном с путешествиями, который я установил в течение года go. У меня не было проблем при создании начальных сообщений, но теперь, после длительного перерыва в добавлении чего-либо на сайт, я получаю ошибки всякий раз, когда пытаюсь добавить или изменить сообщение. Единственное, о чем я могу подумать, может быть, что-то было обновлено в mon goose или MongoDB или что-то еще. Я знаю только то, что я знаю о webDev, из того, что я узнал, наблюдая за полным стеком курса webDev по Udemy, и как бы информативно он ни был, я знаю только, как сделать что-то, как они показали в курсе. Я много раз искал и нашел ряд вопросов с validationErrors, но ни одно из решений, похоже, не решает проблему, с которой я столкнулся, так как все это работало, и в моем коде не было никаких изменений с тех пор, как я в последний раз использовал веб-сайт.

Вот мой журнал ошибок от Heroku:

Error [ValidationError]: Travel validation failed: tags: Cast to String failed for value "[ 'e' ]" at path "tags"
2020-01-29T04:49:40.091426+00:00 app[web.1]:     at ValidationError.inspect (/app/node_modules/mongoose/lib/error/validation.js:61:24)
2020-01-29T04:49:40.091429+00:00 app[web.1]:     at formatValue (internal/util/inspect.js:563:31)
2020-01-29T04:49:40.091432+00:00 app[web.1]:     at inspect (internal/util/inspect.js:221:10)
2020-01-29T04:49:40.091434+00:00 app[web.1]:     at formatWithOptions (internal/util/inspect.js:1693:40)
2020-01-29T04:49:40.091437+00:00 app[web.1]:     at Object.Console.<computed> (internal/console/constructor.js:272:10)
2020-01-29T04:49:40.091439+00:00 app[web.1]:     at Object.log (internal/console/constructor.js:282:61)
2020-01-29T04:49:40.091442+00:00 app[web.1]:     at /app/routes/travels.js:137:21
2020-01-29T04:49:40.091444+00:00 app[web.1]:     at /app/node_modules/mongoose/lib/utils.js:268:11
2020-01-29T04:49:40.091446+00:00 app[web.1]:     at /app/node_modules/mongoose/lib/model.js:4810:21
2020-01-29T04:49:40.091448+00:00 app[web.1]:     at _done (/app/node_modules/mongoose/lib/model.js:3101:16)
2020-01-29T04:49:40.091450+00:00 app[web.1]:     at /app/node_modules/mongoose/lib/model.js:3116:18
2020-01-29T04:49:40.091453+00:00 app[web.1]:     at callbackWrapper (/app/node_modules/mongoose/lib/model.js:3070:20)
2020-01-29T04:49:40.091455+00:00 app[web.1]:     at /app/node_modules/mongoose/lib/model.js:4791:16
2020-01-29T04:49:40.091456+00:00 app[web.1]:     at /app/node_modules/mongoose/lib/utils.js:268:11
2020-01-29T04:49:40.091458+00:00 app[web.1]:     at /app/node_modules/mongoose/lib/model.js:4810:21
2020-01-29T04:49:40.091459+00:00 app[web.1]:     at /app/node_modules/mongoose/lib/model.js:485:16 {
2020-01-29T04:49:40.091461+00:00 app[web.1]:   errors: {
2020-01-29T04:49:40.091463+00:00 app[web.1]:     tags: MongooseError [CastError]: Cast to String failed for value "[ 'e' ]" at path "tags"
2020-01-29T04:49:40.091464+00:00 app[web.1]:         at new CastError (/app/node_modules/mongoose/lib/error/cast.js:39:11)
2020-01-29T04:49:40.091466+00:00 app[web.1]:         at model.$set (/app/node_modules/mongoose/lib/document.js:1201:9)
2020-01-29T04:49:40.091467+00:00 app[web.1]:         at model._handleIndex (/app/node_modules/mongoose/lib/document.js:935:14)
2020-01-29T04:49:40.091469+00:00 app[web.1]:         at model.$set (/app/node_modules/mongoose/lib/document.js:879:22)
2020-01-29T04:49:40.091471+00:00 app[web.1]:         at model.Document (/app/node_modules/mongoose/lib/document.js:137:12)
2020-01-29T04:49:40.091473+00:00 app[web.1]:         at model.Model (/app/node_modules/mongoose/lib/model.js:102:12)
2020-01-29T04:49:40.091474+00:00 app[web.1]:         at new model (/app/node_modules/mongoose/lib/model.js:4611:15)
2020-01-29T04:49:40.091476+00:00 app[web.1]:         at /app/node_modules/mongoose/lib/model.js:3077:22
2020-01-29T04:49:40.091477+00:00 app[web.1]:         at /app/node_modules/mongoose/lib/model.js:3113:7
2020-01-29T04:49:40.091479+00:00 app[web.1]:         at Array.forEach (<anonymous>)
2020-01-29T04:49:40.091480+00:00 app[web.1]:         at /app/node_modules/mongoose/lib/model.js:3112:15
2020-01-29T04:49:40.091482+00:00 app[web.1]:         at Object.promiseOrCallback (/app/node_modules/mongoose/lib/utils.js:261:12)
2020-01-29T04:49:40.091483+00:00 app[web.1]:         at Function.create (/app/node_modules/mongoose/lib/model.js:3047:16)
2020-01-29T04:49:40.091485+00:00 app[web.1]:         at /app/routes/travels.js:135:12
2020-01-29T04:49:40.091493+00:00 app[web.1]:         at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
2020-01-29T04:49:40.091494+00:00 app[web.1]:         at next (/app/node_modules/express/lib/router/route.js:137:13) {
2020-01-29T04:49:40.091496+00:00 app[web.1]:       stringValue: `"[ 'e' ]"`,
2020-01-29T04:49:40.091497+00:00 app[web.1]:       kind: 'String',
2020-01-29T04:49:40.091499+00:00 app[web.1]:       value: [Array],
2020-01-29T04:49:40.091500+00:00 app[web.1]:       path: 'tags',
2020-01-29T04:49:40.091502+00:00 app[web.1]:       reason: [MongooseError],
2020-01-29T04:49:40.091503+00:00 app[web.1]:       message: `Cast to String failed for value "[ 'e' ]" at path "tags"`,
2020-01-29T04:49:40.091505+00:00 app[web.1]:       name: 'CastError'
2020-01-29T04:49:40.091506+00:00 app[web.1]:     }
2020-01-29T04:49:40.091507+00:00 app[web.1]:   },
2020-01-29T04:49:40.091509+00:00 app[web.1]:   _message: 'Travel validation failed',
2020-01-29T04:49:40.091511+00:00 app[web.1]:   name: 'ValidationError'
2020-01-29T04:49:40.091512+00:00 app[web.1]: }

Вот моя схема для ввода "путешествия":

var mongoose = require("mongoose");

var reviewPhoto = new mongoose.Schema({
    imgUrl: String,
    info:   String
});

var travelSchema = new mongoose.Schema({
    
    name:           String,
    category:       String,
    tags:           String,
    splashText:     String,
    body:           String,
    adRight:        String,
    photos: [ reviewPhoto ]
    
    }, { timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' } }
);

module.exports = mongoose.model("Travel", travelSchema);

Вот мой e js с моей формой путешествия, в которую я вношу свои данные при создании нового путешествия. Есть способ добавить больше reviewPhoto на сайт, который добавляет дополнительные записи в массив фотографий, но этот код не включен, так как это не должно быть частью проблемы:

<form action="/travel_new" method="POST">
                    <div id="reviewLeft">
                        <input type="text" name="travel[name]" placeholder="Travel Title" required>
                        <input type="text" name="travel[splashText]" placeholder="Splash Text" required>
                        <input type="text" name="travel[category]" placeholder="Category: ex: Park - Campground - Monument" required>
                        <input type="text" name="travel[tags]" id="tagField" placeholder="Tags - separate tags by a comma ex: sunset,national park,sky" required>
                        <input type="text" name="travel[adRight]" placeholder="need Ad Target url and the image Banner Url separated by comma ,  use none for no ad" required>
                        <textarea id="txDescription" name="travel[body]" placeholder='Start Article' required></textarea>
                        
                    </div>
                    
                    <div id="reviewRight" class="style-10">
                        <div class="border">
                            <input type="text" name="reviewPhoto[0][imgUrl]" placeholder="photo url" required>
                            <input type="text" name="reviewPhoto[0][info]" placeholder="photo Info" required>
                        </div>
                        
                    </div>
                    <input id="submitBtn" type="submit">
                </form>

А вот мой код на моем node.js сервере для почтового маршрута для создания новой записи путешествия:

router.post("/travel_new", isLoggedIn, function(req, res){

    var name     = req.body.travel.name;
    var category = req.body.travel.category || "default";
    var tags     = req.body.travel.tags;
    var splash   = req.body.travel.splashText;
    var body     = req.body.travel.body;
    var adRight  = req.body.travel.adRight  || "none";
    var photos   = req.body.reviewPhoto;
    
    tags = tags.split(",");
    
    //Assemble a variable to send all the review data into the create function for the SCHEMA pattern
    var newTravel = { name: name, category: category, tags: tags, splashText: splash, body: body, adRight: adRight, photos: photos };
    
    Travel.create( newTravel, function(err, travel){ 
        if(err){
            console.log(err);
            res.redirect("travel/new");
        }else{
            // console.log(travel);
            res.redirect("travel");
        }
    });
});

А вот мой пакет. json файл, если он поможет.

{
  "name": "travelSite",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "dependencies": {
    "body-parser": "^1.18.3",
    "ejs": "^2.6.1",
    "express": "^4.16.4",
    "express-session": "^1.15.6",
    "helmet": "^3.15.0",
    "method-override": "^3.0.0",
    "mongoose": "^5.3.12",
    "passport": "^0.4.0",
    "passport-local": "^1.0.0",
    "passport-local-mongoose": "^5.0.1"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node app.js"
  },
  "author": "",
  "license": "ISC"
}

Что меня очень смущает, так это то, что на сайте есть еще одна область, где я могу добавить новую фотографию, и у каждой фотографии есть заголовок, описание и теги, которые я введите, и все это использует почти идентичный код для сохранения и обновления на mongoDB, а раздел фотографий на сайте по-прежнему работает нормально. Это только область, чтобы добавить путешествия. Все это было написано в одно и то же время, и все работало, и теперь, спустя 9 месяцев или около того, не работают только определенные части сайта. Все данные, которые уже находятся в MongoDB, прекрасно загружаются на веб-сайт, все введенные поездки - все загружаются и отображаются нормально, поэтому я знаю, что нет проблем с подключением к MongoDB, и при этом он не поврежден. Кажется, что сообщение об ошибке показывает что-то вроде того, что он пытается преобразовать массив в строку, переменная tags должна быть массивом строк, если я не забуду. Это проблема, когда написание веб-кода - это не ваша настоящая работа, а хобби, которое приходит и уходит каждые 6 месяцев. Я забыл большую часть того, что я узнал, и мне приходится много раз учиться каждый раз, когда у меня появляется время написать еще какой-нибудь веб-код.!

Спасибо за любую помощь, которая может быть оказана.

E

1 Ответ

0 голосов
/ 30 января 2020

Вы передаете массив в tags в своем запросе, который определен как String тип

Итак, у вас должна быть схема, которая поддерживает массив строк, а не просто строку

Сделайте это изменение в вашей схеме

var travelSchema = new mongoose.Schema({
name:           String,
category:       String,
tags:           [String],
splashText:     String,
body:           String,
adRight:        String,
photos: [ reviewPhoto ]
}, { timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' } }
);
...