我正在使用猫鼬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'选项将文档按预期保存到数据库中。
任何帮助将不胜感激。 :)
答案 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}`);
});