如何使 mongo 在 Vertx 中插入或更新之前验证文档


我是使用 Vertx

的新手,我正在使用 Javascript 使用 Vertx + Mongo 构建基本的 API Rest。

我正在寻找某种在插入或更新之前自动验证传入文档的方法(例如,猫鼬中的架构(。

我得到了以下内容:

开机自检入口点 插入新猫

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的全部意义不是创建模式。因此,您可以假定请求应具有要验证的特定必填字段。

最新更新