Как использовать новую функцию проверки схемы MongoDB в Express.js? - PullRequest
1 голос
/ 04 июля 2019

Как реализовать функцию проверки схемы MongoDB на сервере Express? Я работаю над простым приложением todo и решил использовать нативный MongoClient вместо mongoose, но я все еще хочу иметь схему.

Основываясь на документации MongoDB здесь: https://docs.mongodb.com/manual/core/schema-validation/#schema-validation Вы можете либо создать коллекцию со схемой, либо обновить существующую коллекцию без схемы, чтобы иметь ее.Команды выполняются в оболочке mongo, но как вы реализуете это в экспрессе?

Пока что я создал функцию, которая возвращает команды проверки схемы и вызывает ее на всех маршрутах, но я получаю ошибкупоговорка db.runCommand не является функцией.

enter image description here

Вот мой экспресс-сервер:

const express = require("express");
const MongoClient = require("mongodb").MongoClient;
const ObjectID = require("mongodb").ObjectID;
const dotenv = require('dotenv').config();
const todoRoutes = express.Router();
const cors = require("cors");
const path = require("path");
const port = process.env.PORT || 4000;
const dbName = process.env.DB_NAME;
let db;

const app = express();
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

MongoClient.connect(process.env.MONGO_URI,{useNewUrlParser: true},(err,client)=>{
    if(err){
        throw err;
        console.log(`Unable to connect to the databse: ${err}`);
    } else {
        db =  client.db(dbName);
        console.log('Connected to the database');
    }
});

/* Schema Validation Function */
const runDbSchemaValidation = function(){
    return db.runCommand( {
        collMod: "todos",
        validator: { $jsonSchema: {
           bsonType: "object",
           required: [ "description", "responsible","priority", "completed" ],
           properties: {
              description: {
                 bsonType: "string",
                 description: "must be a string and is required"
              },
              responsibility: {
                 bsonType: "string",
                 description: "must be a string and is required"
              },
              priority: {
                bsonType: "string",
                description: "must be a string and is required"
             },
             completed: {
                bsonType: "bool",
                description: "must be a either true or false and is required"
             }
           }
        } },
        validationLevel: "strict"
     } );
}

/* Get list of Todos */
todoRoutes.route('/').get((req,res)=>{
    runDbSchemaValidation();
    db.collection("todos").find({}).toArray((err,docs)=>{
        if(err)
            console.log(err);
        else {
            console.log(docs);
            res.json(docs);
        }
    });
});

/* Get Single Todo */
todoRoutes.route('/:id').get((req,res)=>{
    let todoID = req.params.id;
    runDbSchemaValidation();
    db.collection("todos").findOne({_id: ObjectID(todoID)}, (err,docs)=>{
        if(err)
            console.log(err);
        else {
            console.log(docs);
            res.json(docs);
        }
    });
});

/* Create Todo */
todoRoutes.route('/create').post((req,res,next)=>{
    const userInput = req.body;
    runDbSchemaValidation();
    db.collection("todos").insertOne({description:userInput.description,responsible:userInput.responsible,priority:userInput.priority,completed:false},(err,docs)=>{
        if(err)
            console.log(err);
        else{
            res.json(docs);
        }
    });
});

/* Edit todo */
todoRoutes.route('/edit/:id').get((req,res,next)=>{
    let todoID = req.params.id;
    runDbSchemaValidation();
    db.collection("todos").findOne({_id: ObjectID(todoID)},(err,docs)=>{
        if(err)
            console.log(err);
        else {
            console.log(docs);
            res.json(docs);
        }
    });
});

todoRoutes.route('/edit/:id').put((req,res,next)=>{
    const todoID = req.params.id;
    const userInput = req.body;
    runDbSchemaValidation();
    db.collection("todos").updateOne({_id: ObjectID(todoID)},{ $set:{ description: userInput.description, responsible: userInput.responsible, priority: userInput.priority, completed: userInput.completed }},{returnNewDocument:true},(err,docs)=>{
        if(err)
            console.log(err);
        else
            res.json(docs);
        console.log(db.getPrimaryKey(todoID));
    });
});

/* Delete todo */
todoRoutes.route('/:id').delete((req,res,next)=>{
    const todoID = req.params.id;
    runDbSchemaValidation();
    db.collection("todos").deleteOne({_id: ObjectID(todoID)},(err,docs)=>{
        if(err)
            console.log(err)
        else{
            res.json(docs);
        }
    });
});

app.use('/todos',todoRoutes);

app.listen(port,()=>{
    console.log(`Server listening to port ${port}`);
});

Я также попробовал это на начальном клиентском соединении, но я получил ту же ошибку: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...