#javascript #mongodb #vert.x
#javascript #mongodb #vert.x
Вопрос:
Я новичок в использовании Vertx, я создаю базовый Api Rest с Vertx Mongo, используя Javascript.
Я ищу какой-нибудь способ автоматической проверки входящих документов перед вставкой или обновлением (например, что-то вроде schemas в Mongoose).
Я получил следующее:
После точки входа Вставляем новый cat
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);
Функция контроллера, вставляющая новый cat
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.
TL; DR — Я хочу знать, есть ли какой-нибудь способ сообщить Mongo, что поле name ВСЕГДА обязательно.
Решение, которое я использовал:
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')
});
Ответ №1:
В mongodb существует концепция проверки с фильтрами запросов для сбора:https://docs.mongodb.com/manual/core/schema-validation/#query-expressions
Если поле «имя» всегда обязательно, вы можете создать свою коллекцию следующим образом:
db.createCollection("cats", {
validator: {
$and: [ {"name": {$type: "string", $exists: true}} ]
})
Комментарии:
1. Это не работает, в документе Vertx говорится, что второй аргумент createCollection — это функция (я полагаю, функция обратного вызова?). Я думаю, что Vertx использует уменьшенную версию Java-драйвера MongoDB Vertx Mongo guide . Я нашел это , но я не смог заставить это работать.
2. я не имел в виду, что это выполняется с помощью драйвера vertx mongo, вы можете просто использовать командную строку mongo. Но если вы настаиваете на запуске с драйвером vertx mongo, просто используйте функцию runCommand.
Ответ №2:
вы можете создать свою собственную схему в отдельном файле json, затем создать свой собственный метод проверки, когда контекст предоставляется вашим маршрутизатором.
Я предполагаю, что разные конечные точки имеют разную проверку.
вы также можете создать промежуточное программное обеспечение с помощью gateleen
у вас есть множество вариантов, mongoose имеет свои преимущества, но весь смысл использования mongodb не в создании схемы. Следовательно, вы можете предположить, что запрос должен содержать определенные обязательные поля для проверки.