【发布时间】:2018-04-01 02:56:21
【问题描述】:
编辑:问题可能是路径问题。我当前的查询如下所示:
router.route('/projects/:project_id/techDetails')
.get(function(req, res) {
Project.findById(req.params.project_Id, function(err, project) {
if (err)
return res.send(err);
res.json(project);
console.log('get success (project techDetails)');
});
});
这将返回null。尽管除了在路由中添加了 `/techDetails' 之外,它在各方面都与工作代码行相同。
原始问题:
我正在使用 express 和 mongo 构建一个 MEAN 堆栈应用程序。我不知道如何正确路由到嵌套文档。
这是我的项目架构:
const ProjectSchema = new Schema({
idnumber: { type: Number, required: true },
customername: String,
projectdetails: String,
jobaddress: String,
techDetails: [{
scope: String,
edgedetail: String,
lamination: String,
stonecolour: String,
slabnumber: String,
slabsupplier: String,
purchaseordernum: String,
splashbacks: String,
apron: String,
hotplate: String,
sink: String,
sinkdetails: String,
tappos: String
}],
sitecontactname: String,
sitecontactnum: String,
specialreq: String,
install_date: String,
created_on: { type: Date, default: Date.now },
created_by: { type: String, default: 'SYSTEM' },
active: { type: Boolean, default: true },
flagged: { type: Boolean, default: false },
});
我可以通过GET 和POST 成功路由到/projects,以及通过GET、PUT 和DEL 路由到/projects/:project_id。
使用PUT 路由和项目的_ID,我可以将新条目推送到项目的techDetails 子文档数组。生成的 JSON 数据 如下所示:
{
"_id": "59e577e011a3f512b482ef13",
"idnumber": 52,
"install_date": "10/20/2017",
"specialreq": "some...",
"sitecontactnum": "987654321",
"sitecontactname": "bill",
"jobaddress": "123 st",
"projectdetails": "some stuff",
"customername": "B Builders",
"__v": 16,
"flagged": false,
"active": true,
"created_by": "SYSTEM",
"created_on": "2017-10-17T03:24:16.423Z",
"techDetails": [
{
"scope": "Howitzer",
"edgedetail": "12mm",
"lamination": "No",
"stonecolour": "Urban™",
"slabnumber": "1",
"slabsupplier": "Caesarstone",
"purchaseordernum": "no",
"splashbacks": "No",
"apron": "No",
"hotplate": "N/A",
"sink": "N/A",
"sinkdetails": "no",
"tappos": "no",
"_id": "59e577e011a3f512b482ef14"
},
{
"scope": "kitchen",
"edgedetail": "12mm",
"lamination": "etc",
"_id": "59e7da445d9d7e109c18f38b"
},
{
"scope": "Vanity",
"edgedetail": "12mm",
"lamination": "No",
"stonecolour": "Linen™",
"slabnumber": "1",
"slabsupplier": "Caesarstone",
"purchaseordernum": "1",
"splashbacks": "No",
"apron": "No",
"hotplate": "N/A",
"sink": "N/A",
"sinkdetails": "no",
"tappos": "woo",
"_id": "59e81e3324fb750fb46f8248"
}//, more entries omitted for brevity
]
}
如您所见,到目前为止一切都按预期工作。但是现在我需要编辑和删除这个 techDetails 数组中的单个条目。我还想直接使用projects/:project_id/techDetails 和projects/:project_id/techDetails/:techdetails_id 路由到他们。
据我所知,有两种方法。我可以:
A) 为使用 mergeParams 的 techDetails 使用新的路由文件。这是我目前正在尝试的方法,但是我不知道如何完成.find 以返回所有techDetails,因为我只能使用Project 模型架构并且我不确定如何访问子文档。
摘自我的 routes.js:
const techDetails = require('./techDetails');
//other routes here
//see techdetails file
router.use('/projects/:project_id/techdetails', techDetails);
//here lies an earlier, failed attempt
/* router.route('/projects/:project_id/techdetails/:techDetails_id')
.get(function(req, res) {
Project.findById(req.params.project_id.techDetails_id, function(err,
project) {
if (err)
return res.send(err);
res.json(project.techDetails);
console.log('get success (techDetails)');
});
})
; */
还有我的 techdetails.js:
const express = require('express');
const Project = require('./models/project');
const router = express.Router({mergeParams: true});
router.get('/', function (req, res, next) {
/* Project.find(function(err, techDetails) {
if (err)
return res.send(err);
res.json(techDetails);
console.log('get success (all items)');
}); */
res.send('itemroutes ' + req.params);
})
router.get('/:techDetails_id', function (req, res, next) {
res.send('itemroutes ' + req.params._id)
})
module.exports = router
我可以成功地检查路由是否与 Postman 一起使用,两者都会收到响应。现在的问题是,我想使用 res.json 和 Project.find(或类似的)来获取 techDetails,而不是 res.send。
不过还有另一种选择:
B) 将 techDetails 文档放入它自己的架构中,然后在项目中填充 ID 数组。
但是这似乎更复杂,所以如果可以的话,我宁愿避免这样做。
欢迎任何想法和建议。如果需要更多代码,请告诉我。
【问题讨论】:
标签: node.js mongodb express mongoose mean-stack