javascript - 在模式中包含子模式似乎不适用于猫鼬
问题描述
这就是我定义子模式和模式的方式
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const JobSchema = new Schema ({
jobname: String,
jobstatus: String
})
const DataSchema = new Schema ({
username: {
type: String,
required: true,
unique: true
},
jobs: [JobSchema]
});
module.exports = mongoose.model("data", DataSchema);
这段代码是利用上面的模式作为模型
const express = require("express");
const router = express.Router();
const Data = require("../../models/Data");
router.post("/", (req, res) => {
const newData = new Data({
username: req.body.username,
jobs: req.body.jobs
});
newData
.save()
.then(data => res.json(data))
.catch(err => console.log(err));
});
module.exports = router;
我试图输入的数据:
{
username: France,
jobs: [{jobname: Google, jobstatus: applied}]
}
错误:
Error: data validation failed: jobs: Cast to embedded failed for value "'[{jobname: Google, jobstatus: applied}]'" at path "jobs"
at ValidationError.inspect (/Users/Desktop/server/node_modules/mongoose/lib/error/validation.js:48:26)
at formatValue (internal/util/inspect.js:723:31)
at inspect (internal/util/inspect.js:289:10)
at formatWithOptionsInternal (internal/util/inspect.js:1918:40)
at formatWithOptions (internal/util/inspect.js:1802:10)
at Object.Console.<computed> (internal/console/constructor.js:304:10)
at Object.log (internal/console/constructor.js:314:61)
at /Users/Desktop/server/routes/api/data.js:14:31
at processTicksAndRejections (internal/process/task_queues.js:97:5) {
errors: {
jobs: CastError: Cast to embedded failed for value "'[{jobname: Google, jobstatus: applied}]'" at path "jobs"
at DocumentArrayPath.cast (/Users/Desktop/server/node_modules/mongoose/lib/schema/documentarray.js:449:19)
at DocumentArrayPath.cast (/Users/Desktop/server/node_modules/mongoose/lib/schema/documentarray.js:378:17)
at DocumentArrayPath.SchemaType.applySetters (/Users/Desktop/server/node_modules/mongoose/lib/schematype.js:1031:12)
at model.$set (/Users/Desktop/server/node_modules/mongoose/lib/document.js:1203:20)
at model._handleIndex (/Users/Desktop/server/node_modules/mongoose/lib/document.js:979:14)
at model.$set (/Users/Desktop/server/node_modules/mongoose/lib/document.js:920:22)
at model.Document (/Users/Desktop/server/node_modules/mongoose/lib/document.js:137:12)
at model.Model (/Users/Desktop/server/node_modules/mongoose/lib/model.js:106:12)
at new model (/Users/Desktop/server/node_modules/mongoose/lib/model.js:4695:15)
at /Users/Desktop/server/routes/api/data.js:7:21
at Layer.handle [as handle_request] (/Users/Desktop/server/node_modules/express/lib/router/layer.js:95:5)
at next (/Users/Desktop/server/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/Users/Desktop/server/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/Users/Desktop/server/node_modules/express/lib/router/layer.js:95:5)
at /Users/Desktop/server/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/Users/Desktop/server/node_modules/express/lib/router/index.js:335:12) {
stringValue: `"'[{jobname: Google, jobstatus: applied}]'"`,
messageFormat: undefined,
kind: 'embedded',
value: "'[{jobname: Google, jobstatus: applied}]'",
path: 'jobs',
reason: ObjectParameterError: Parameter "obj" to Document() must be an object, got [{jobname: Google, jobstatus: applied}]
at EmbeddedDocument.Document (/Users/Desktop/server/node_modules/mongoose/lib/document.js:90:11)
at EmbeddedDocument [as constructor] (/Users/Desktop/server/node_modules/mongoose/lib/types/embedded.js:42:12)
at new EmbeddedDocument (/Users/Desktop/server/node_modules/mongoose/lib/schema/documentarray.js:115:17)
at DocumentArrayPath.cast (/Users/Desktop/server/node_modules/mongoose/lib/schema/documentarray.js:442:22)
at DocumentArrayPath.cast (/Users/Desktop/server/node_modules/mongoose/lib/schema/documentarray.js:378:17)
at DocumentArrayPath.SchemaType.applySetters (/Users/Desktop/server/node_modules/mongoose/lib/schematype.js:1031:12)
at model.$set (/Users/Desktop/server/node_modules/mongoose/lib/document.js:1203:20)
at model._handleIndex (/Users/Desktop/server/node_modules/mongoose/lib/document.js:979:14)
at model.$set (/Users/Desktop/server/node_modules/mongoose/lib/document.js:920:22)
at model.Document (/Users/Desktop/server/node_modules/mongoose/lib/document.js:137:12)
at model.Model (/Users/Desktop/server/node_modules/mongoose/lib/model.js:106:12)
at new model (/Users/Desktop/server/node_modules/mongoose/lib/model.js:4695:15)
at /Users/Desktop/server/routes/api/data.js:7:21
at Layer.handle [as handle_request] (/Users/Desktop/server/node_modules/express/lib/router/layer.js:95:5)
at next (/Users/Desktop/server/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/Users/Desktop/server/node_modules/express/lib/router/route.js:112:3)
}
},
_message: 'data validation failed'
}
我从互联网上的几个来源中了解到子模式(又名子文档)的想法是可能的。但是,当我尝试如上所示实现它时,它无法工作。这背后的原因是什么?
解决方案
该错误看起来像您正在分配一个字符串jobs
而不是数组对象。我认为你目前正在保存的是
{
username: "France",
jobs: "[{jobname: Google, jobstatus: applied}]" // the whole array as string
}
你应该保存的是
{
username: "France",
jobs: [{jobname: "Google", jobstatus: "applied"}]
}
请控制台记录req.body.jobs
并检查它是否是正确的 JSON 数组
推荐阅读
- android - 运行时应用程序本地化不适用于应用程序包
- netbeans - 如何在保存时在 netbeans 中运行静态代码分析
- google-app-engine - 如何在应用引擎上安装 linux 环境依赖项(apt-get install)
- python - 使用 openpyxl 在电子表格中创建名称范围
- android - 为什么当我关闭屏幕时我的 Httppost 不工作?
- python - FeatureUnion ,带有 tfidf 特征的管道分类特征抛出错误
- oracle - Oracle JDBC Resultset.getString("COLUMN_DEF") 返回小写引号字符串
- configuration - 在 kube-apiserver 中设置功能门 RuntimeClass
- reactjs - 如何从我的示例中使 React 组件看起来更具可读性和简洁性?
- excel - Excel:计算员工一周内一起工作的频率?