即使存在必需的字段,Mongoose也会给出验证错误

时间:2017-07-19 07:31:42

标签: node.js mongoose mongoose-schema

我正在使用猫鼬ODM进行项目。我的架构如下所示:

const applicantSchema = new Schema({
  regno: {
  type: String,
  unique: true,
  required: true
  },
  email: {
  type: String,
  unique: true,
  required: true
  }
});

const Applicant = mongoose.model('Applicant', applicantSchema);

我创建了一个包装函数来添加一个如下所示的新文档:

function addApplicant(newApplicant, callback){
  mongoose.connect(url);

  const db = mongoose.connection;

  console.log(newApplicant);
  console.log(typeof newApplicant);

  const applicant = new Applicant(newApplicant);

  applicant.save((err) => {
    if(err) return callback(err);
    let info = "successfully saved target"; 
    return callback(null, info);
  });
}

我在处理相关帖子请求的路线中调用此函数。

router.post('/applicant/response', (req, res) => {
  //process sent response here and add to DB
  //console.log(req.body);
  let newApplicant = {
    regno: req.body.regno,
    email: req.body.email
  }
  //console.log(newApplicant);

  applicant.addApplicant(newApplicant, (err, info) => {
    if(err){ console.log(err); res.end(err);}
    res.end('complete, resp: ' + info);
  });
});

但是,即使我正在为regno提供值,mongoose也会给我一个验证错误(路径' regno'是必需的)。所有标记为必需的字段都会发生这种情况。

如果我删除了' required:true'选项将文档按预期保存到数据库中。

任何帮助将不胜感激。 :)

2 个答案:

答案 0 :(得分:0)

事实证明,在这种情况下,邮递员在POST请求中发送数据的方式出了问题。当我稍后使用JSON作为数据格式(并确保Content-Type标头设置为application / json)在postman中测试时,代码按预期工作。

对于那些面临类似问题的人,请检查邮递员随请求发送的标题,并确保它们符合您的期望。

答案 1 :(得分:0)

在快递入口文件中,您可以暴露端点和设置快递,app.use(express.json());应该写在端点上方。

const express = require("express");
require("./src/db/mongoose");

const User = require("./src/models/user");

const app = express();
const port = process.env.PORT || 3000;

// THIS LINE IS MANDATORY
app.use(express.json());

app.post("/users", async(req, res) => {
  const user = new User(req.body);

  try {
    await user.status(201).save();

    res.send(user);
  } catch (error) {
    res.status(400).send(error);
  }
});

app.listen(port, () => {
  console.log(`Server is runnung in port ${port}`);
});