У меня проблема. Я новичок в 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()
, что, похоже, включает проверку.
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));
Я считаю, что вы передаете пустую строку, и поэтому валидаторы не отмечают записи как ошибочные. Попробуйте передать значение null для полей и проверьте поведение.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.