如何在插入或更新 Vertx 之前使 mongo 验证文档?
How to make mongo validate documents before insert or update in Vertx?
我是使用 Vertx 的新手,我正在构建一个基本的 Api Rest with Vertx + Mongo 使用 Javascript。
我正在寻找某种方法在插入或更新之前自动验证传入的文档(例如,Mongoose 中的模式)。
我得到以下信息:
POST入口点插入新猫
var BodyHandler = require("vertx-web-js/body_handler");
var Router = require("vertx-web-js/router");
var router = Router.router(vertx);
router.post("/cat")
.produces("application/json")
.handler(BodyHandler.create().handle)
.handler(controller.createCat);
控制器的功能插入一只新猫
createCat: function (ctx) {
var response = ctx.response();
var body = ctx.getBodyAsJson() || {};
console.log('inserting cat')
connection.mongoClient.insert("cats", { name: body.name }, function (res, res_err) {
if (res_err == null) {
var id = res;
console.log("Inserted cat with id " + id);
response.putHeader("content-type", "application/json");
response.end(JSON.stringify(id));
} else {
console.log('err')
res_err.printStackTrace();
}
});
}
问题是我可以插入空文档,结果文档只有一个字段:mongo ID。
TL;DR - 我想知道是否有某种方法可以告诉 Mongo 名称字段始终是必需的。
我使用的解决方案:
mongoClient.runCommand("collMod", { collMod: "cats", validator: { $and: [ {"name": {$type: "string", $exists: true}} ] }, validationLevel: "strict", validationAction: "error" }, function(res, res_err) {
if (res_err) res_err.printStackTrace()
else console.log('The schema of cats collection has been updated')
});
在 mongodb 中有一个使用集合查询过滤器进行验证的概念:https://docs.mongodb.com/manual/core/schema-validation/#query-expressions
如果 "name" 字段始终是必需的,您可以像这样创建您的集合:
db.createCollection("cats", {
validator: {
$and: [ {"name": {$type: "string", $exists: true}} ]
})
您可以在单独的 json 文件中创建您自己的模式,然后在您的路由器提供上下文时创建您自己的验证方法。
我假设不同的端点有不同的验证。
您还可以使用 gateleen
创建一个中间件
你有很多选择,猫鼬有它的好处,但使用 mongodb 的全部意义不是创建模式。因此,你可以假设请求应该有特定的必填字段来验证。
我是使用 Vertx 的新手,我正在构建一个基本的 Api Rest with Vertx + Mongo 使用 Javascript。
我正在寻找某种方法在插入或更新之前自动验证传入的文档(例如,Mongoose 中的模式)。
我得到以下信息:
POST入口点插入新猫
var BodyHandler = require("vertx-web-js/body_handler");
var Router = require("vertx-web-js/router");
var router = Router.router(vertx);
router.post("/cat")
.produces("application/json")
.handler(BodyHandler.create().handle)
.handler(controller.createCat);
控制器的功能插入一只新猫
createCat: function (ctx) {
var response = ctx.response();
var body = ctx.getBodyAsJson() || {};
console.log('inserting cat')
connection.mongoClient.insert("cats", { name: body.name }, function (res, res_err) {
if (res_err == null) {
var id = res;
console.log("Inserted cat with id " + id);
response.putHeader("content-type", "application/json");
response.end(JSON.stringify(id));
} else {
console.log('err')
res_err.printStackTrace();
}
});
}
问题是我可以插入空文档,结果文档只有一个字段:mongo ID。
TL;DR - 我想知道是否有某种方法可以告诉 Mongo 名称字段始终是必需的。
我使用的解决方案:
mongoClient.runCommand("collMod", { collMod: "cats", validator: { $and: [ {"name": {$type: "string", $exists: true}} ] }, validationLevel: "strict", validationAction: "error" }, function(res, res_err) {
if (res_err) res_err.printStackTrace()
else console.log('The schema of cats collection has been updated')
});
在 mongodb 中有一个使用集合查询过滤器进行验证的概念:https://docs.mongodb.com/manual/core/schema-validation/#query-expressions
如果 "name" 字段始终是必需的,您可以像这样创建您的集合:
db.createCollection("cats", {
validator: {
$and: [ {"name": {$type: "string", $exists: true}} ]
})
您可以在单独的 json 文件中创建您自己的模式,然后在您的路由器提供上下文时创建您自己的验证方法。
我假设不同的端点有不同的验证。
您还可以使用 gateleen
你有很多选择,猫鼬有它的好处,但使用 mongodb 的全部意义不是创建模式。因此,你可以假设请求应该有特定的必填字段来验证。