Как проверить входные данные db.collections.insertOne на mongoose и node.js - PullRequest
0 голосов
/ 23 октября 2018

У меня проблема.Я новичок в 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

Спасибо.

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

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

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

0 голосов
/ 23 октября 2018

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

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

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

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));
...