У меня проблема. Я новичок в node.js и mongoDB (использую mongoose). В MySQL, когда я определил таблицу с обязательными полями, база данных откажется принимать ввод, который не соответствует правилам модели. Я заметил, что в mongoDB, по крайней мере, так, как я его настроил, это не так.

Я определил следующую модель в blog-schema.js:

const mongoose = require('mongoose');

var Schema = mongoose.Schema;

var userSchema = mongoose.Schema({
        title: {
            type:String,
            required: true,
        },
        author: {
            type: String,
            required: true,
        },
        category: {
            type: String,
            required: true,
        },
        text: {
            type: String,
            required: true,
        },
        date: {
            type: Date,
            default: Date.now,
        },
    })

module.exports = mongoose.model('BlogPost', userSchema, 'blog');

Здесь я установил required:true для всех полей, кроме date. Затем я реализовал это в conn.js:

const mongoose = require('mongoose')
, BlogPost = require('./schemata/blog-schema')
, db_config = require('./config')
, uri = 'mongodb://' + db_config.user + ":" + db_config.password + "@" + db_config.host + db_config.database;

 DataFunctions = function (){

    mongoose.connect(uri, db_config.opts);

    mongoose.Promise = global.Promise;

    this.connections = {};
    this.schemas = {};

    this.schemas.BlogPost = BlogPost;

    this.connections.db = mongoose.connection;
};

DataFunctions.prototype.insert = function(data = {}, callback = null) {
    var schema = this.schemas.BlogPost;

    this.connections.db.on('error', console.error.bind(console, 'connection error'));
    this.connections.db.once('open', function(dataStructure = schema) {
        this.items = data;


        if (callback != null) {
            dataStructure.collection.insertOne(this.items, callback);
            mongoose.connection.close();
        }
        else {
            dataStructure.collection.insertOne(this.items, function(err, docs)     {
                if (err) throw err;
            });
            mongoose.connection.close();
        }

    });

    mongoose.connection.close();
    }

    DataFunctions.prototype.retrieve = function(params = {}, columns = '', callback = null) {
    var schema = this.schemas.BlogPost;

    this.connections.db.on('error', console.error.bind(console, 'connection error'));
    this.connections.db.once('open', function(dataStructure = schema) {

        if (callback != null) {
            dataStructure.find(params, columns, callback);
        }
        else {
            dataStructure.find(params, columns, function(err, data) {
                if (err) throw err;
            });

        }
    });


}


module.exports = DataFunctions;

Однако, когда я выполняю функцию вставки, она принимает ее без ошибок, даже если поля, отмеченные required, остаются пустыми. Я был бы очень признателен за любую помощь в разработке того, как проверить данные, вставленные в коллекцию mongoDB.

Я использую mongoos версии 5.3.6 и mongoDB версии 4.0.3

Спасибо.

< Сильный > Edit Спасибо всем, кто ответил, на основании некоторых комментариев ниже я изменил dataStructure.collection.insertOne() на dataStructure.create(), что, похоже, включает проверку.

0
Isocrates 23 Окт 2018 в 18:11

2 ответа

Лучший ответ

Вам также необходимо добавить подтверждение при отправке или перед отправкой. Если в форме есть ошибки, она фактически недействительна, поэтому перед отправкой проверьте, не является ли она недействительной.

Tbh ваш код кажется немного многословным, сложным и запутанным ... есть ли причина, по которой вы делаете это так? Например, вы используете схему мангуста, но на самом деле не отправляете с помощью методов мангуста, поэтому ни одна из ваших проверок не выполняется .. insertOne не является методом мангуста, и вы не используете свою модель для сохранения записи. это будет model.save (данные)

Также вы можете напрямую сохранить, не вызывая схему снова, просто объявите новую переменную.

const post = new BlogPost(data); post.save().then(console.log).catch(console.log);


//also mongoose.connect already returns a promise

mongoose
  .connect(
    dbUrl,
    { useNewUrlParser: true }
  )
  .then(() => console.log("Connected"))
  .catch(error => console.log("Failed " + error));
2
Pari Baker 24 Окт 2018 в 15:33

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

0
shmit 23 Окт 2018 в 21:12
52952422