猫鼬验证器不是吗?

时间:2019-01-07 12:16:13

标签: javascript node.js mongodb express mongoose

我有一个小应用程序,可通过Mongoose与MongoDB进行交互。在我做了一些细微的更改(从一个您可以在其中导入,导出数据的页面将每个动作导出到多个页面)之后,不再调用猫鼬验证器,我也似乎不明白为什么。

代码如下:

somer.js

var mongoose = require("mongoose");

function validareCNP(x)
{
    return /\d{13}/;
}

function formatareData(x)
{
    if(x.getDate() < 10 && (x.getMonth()+1) <10)
    {
        return "0" + x.getDate() + "-0" + (x.getMonth()+1) + "-" + x.getFullYear();
    }
    else if(x.getDate() > 10 && (x.getMonth()+1) <10)
    {
        return x.getDate() + "-0" + (x.getMonth()+1) + "-" + x.getFullYear();
    }
    else if(x.getDate() < 10 && (x.getMonth()+1) > 10)
    {
        return "0" + x.getDate() + "-" + (x.getMonth()+1) + "-" + x.getFullYear();
    }
    return x.getDate() + "-" + (x.getMonth()+1) + "-" + x.getFullYear();
}

var someriSchema = new mongoose.Schema({
    nume: {type: String, required: true},
    prenume: {type: String, required: true},
    cnp: {type: Number,
        unique: true,
        validate: {
            validator: validareCNP,
            message: "CNP-ul trebuie sa aiba 13 cifre!"
        },
        required: true
    },
    dataIntroduceriiDB: {type:Date, default: Date.now, get: formatareData},
    dataIntroduceriiProiect: {type:Date, required: true, get: formatareData},
    timpRamas: {type: Number, default: 30},
    regiune: {type: Number, required: true},
    creatDe: {type: String, required: true},
    dezactivat: {type: Boolean, default: false}
});

var someri = mongoose.model('someri', someriSchema, 'someri');

module.exports = someri;

new.ejs

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title><%= title %></title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
    <link rel="stylesheet" type="text/css" href="../../reset.css"/>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <link rel="stylesheet" type="text/css" href="../../css.css"/>
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css" integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous"> 
</head>
<body>
    
<nav class="navbar navbar-expand-lg navbar-dark bg-orange">
    <a class="navbar-brand" href="#" style="margin-right: 4rem;">Salut, <%= user.username %>!</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
        </button>
    <div class="collapse navbar-collapse" id="navbarNav">
        <ul class="navbar-nav">
    <li class="nav-item active">
        <a class="nav-link" href="/judet/<%= id %>">Home<span class="sr-only">(current)</span></a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="/judet/<%= id %>/new">Import</a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="/judet/<%= id %>/download">Export</a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="#">Ghid Utilizare</a>
    </li>
    <% if(user.privileges[0].region == 1) { %>
    <li class="nav-item">
        <a class="nav-link" href="/register">Admin</a>
    </li>
    <% } %>
    </ul>
    <ul class="navbar-nav ml-auto">
        <li class="nav-item">
            <a class="nav-link" href="#"><i class="fas fa-sign-out-alt"></i></a>
        </li>
    </ul>
</div>
</nav>

<div class="container-fluid container-import">
        <div class="formular-dashboard"><h3>Introducand datele manual</h3>
        <form action="/judet/<%= id  %>/new" method="POST">
            <label for="nume">Nume:</label>
            <input type="text" name="nume" id="name-dash" placeholder="nume"><br/>
            <label for="prenume">Prenume:</label>
            <input type="text" name="prenume" id="prename-dash" placeholder="prenume"><br/>
            <label for="cnp">CNP:</label>
            <input type="text" name="cnp" id="cnp-dash" placeholder="cnp"><br/>
            <label for="data">Data introducerii in proiect:</label>
            <input type="date" name="data" id="data-dash" placeholder="ll/zz/an" value="2018-01-01"><br/>
        <button class="submit-dashboard">Trimite</button></span>
        <aside class="aside-import">*formatul datei este ll/zz/an</aside>
        <% if(errCode === 0) { %>
            <span class="succes-import">Somer adaugat cu success!</span>
        <% } %>
        <% if(errCode === 1) { %>
            <span class="eroare-import">Eroare! Verifica ghidul de utilizare!</span>
        <% } %>
        </div>
        <div class="csv-dashboard"><h3>Introducand datele prin CSV</h3>
        </form>
        <form action="/judet/<%= id  %>/upload" method="POST" encType="multipart/form-data">
            <input type="file" name="file" accept="*.csv"/>
            <input type='submit' value='Upload!' />
        </form>
        </div>
</div>

<% include partials/footer.ejs %>

路线

router.get('/judet/:id([0-9]{2})/new', middleware.access2, function(req, res)
{
      var title = "New | Best DAVNIC73";
      Somer.find({"regiune": req.params.id}, function(err, someri)
      {
        if(err)
        {
            console.log(err);
        }
        else
        {
            res.render("new", {title: title, id:req.params.id, user: req.user});
        }
      });
});

router.post('/judet/:id([0-9]{2})/new', middleware.access2, function(req, res)
{
      Somer.create({
        nume: req.body.nume,
        prenume: req.body.prenume,
        cnp: req.body.cnp,
        dataIntroduceriiProiect: req.body.data,
        regiune: req.params.id,
        creatDe: req.user.username
      }, function(err) {
          if(err)
          {
              req.session.errCode = 1;
              console.log(err);
              return res.redirect("back");
          }
          else
          {
              req.session.errCode = 0;
              res.redirect("back");
          }
      });
});

我不明白为什么它不再验证该字段。 CNP应该是包含13个数字的字段。它一直有效,直到我更改了它(我记得,我不是100%确信),但现在没有了。我可以在该字段中传递任意数量的数字,而不会出现任何错误。

您能告诉我为什么会发生这种情况吗,我该如何解决? 谢谢。

1 个答案:

答案 0 :(得分:0)

Salut Andrei,您可以简单地使用:

var someriSchema = new mongoose.Schema({
  // ...
  cnp: {
    type: Number,
    unique: true,
    validate: {
      validator: (CNP) => CNP.toString().length === 13,
      message: "CNP-ul trebuie sa aiba 13 cifre!",
    },
    required: true
  },
  // ...
});

如果您的版本不支持箭头功能,请使用常规功能:

validate: {
  validator: function (CNP) { return CNP.toString().length === 13 },
  message: "CNP-ul trebuie sa aiba 13 cifre!",
},