开发node.js应用。由于某种原因,即使我已验证req.params.id有效且应返回数据,该findOne调用始终返回未定义的值。
let event = await Event.findOne({ venue: ObjectId(req.params.id) });
我也尝试过......
let event = await Event.findOne({ venue: req.params.id });
这是我的Event模型定义的一部分。...
const EventSchema = new mongoose.Schema({
eventDate: {
type: Date
},
venue: {
type: mongoose.Schema.ObjectId,
ref: 'Venue'
},
在邮递员中,我正在针对 / venues / 5e0401c4a246333ca4ced332 网址执行 Delete http动词。
基本上,我想在事件表中搜索场地ID。在决定删除它之前,我正在查看某个事件是否正在使用该场所。
这是整个方法...
// @desc Delete venue
// @route DELETE /api/v1/venues/:id
// @access Private
exports.deleteVenue = asyncHandler(async (req, res, next) => {
let venue = await Venue.findById(req.params.id);
if (!venue) {
return next(
new ErrorResponse(`No venue with the id of ${req.params.id}`, 404)
);
}
if (req.user.role !== 'manager' && req.user.role !== 'admin') {
return next(new ErrorResponse(`Not authorized to delete venue`, 401));
}
// the following line always returns undefined even though the venue
// exists in the events table.... then it jumps to the end of the method
let event = await Event.findOne({ venue: ObjectId(req.params.id) });
if (event) {
return next(
new ErrorResponse(
`You cannot delete a venue because events are tied to it.`,
404
)
);
}
await Venue.remove();
res.status(200).json({
success: true,
data: {}
});
});
使用指南针,查看事件集合,我肯定会看到使用我提交的ID的记录...
_id:5e045b6e0c38f2502440ecb7
attendees:Array
eventDate:2020-01-01T05:00:00.000+00:00
venue:5e0401c4a246333ca4ced332
status:"planning"
我做到了...
console.log(`id is ${req.params.id}`);
let event = await Event.findOne({ venue: req.params.id });
结果显示我正在传递正确的ID。...(控制台输出)
id is 5e0401c4a246333ca4ced332
ReferenceError: Event is not defined
at C:\Projects\abc\controllers\venues.js:90:15
任何见识将不胜感激。谢谢!
答案 0 :(得分:1)
似乎您没有导入事件模型。 您需要添加:
const Event = require("../models/event"); //you need to change the path
之后,您需要找到以下事件:
Event.findOne({ venue: req.params.id })
。
我还有一些建议:
1-)在开始时检查角色授权更有意义。
2-)首先检查给定场地是否有任何活动,如果没有活动,请使用findByIdAndDelete
方法。这样,由于我们消除了Venue.findById
3-)如果场地有事件,则使用404状态代码似乎不正确。 我认为400-错误的请求更合适。
4-)猫鼬会转换_id,因此无需使用ObjectId。
exports.deleteVenue = asyncHandler(async (req, res, next) => {
if (req.user.role !== "manager" && req.user.role !== "admin") {
return next(new ErrorResponse(`Not authorized to delete venue`, 401));
}
let event = await Event.findOne({ venue: req.params.id });
if (event) {
return next(new ErrorResponse(`You cannot delete a venue because events are tied to it.`,400));
}
let venue = await Venue.findByIdAndDelete(req.params.id);
console.log(venue);
if (!venue) {
return next(new ErrorResponse(`No venue with the id of ${req.params.id}`, 404));
}
res.status(200).json({
success: true,
data: {}
});
});
测试:
假设我们有以下两个Venue文档。
{
"_id" : ObjectId("5e0471e3394d1e2b348b94aa"),
"name" : "Venue 1",
},
{
"_id" : ObjectId("5e0471eb394d1e2b348b94ab"),
"name" : "Venue 2",
}
还有一个活动文档,其地点为1号地点,ID为5e0471e3394d1e2b348b94aa:
{
"_id" : ObjectId("5e04727c76da213f8c9bf76a"),
"eventDate" : ISODate("2019-12-26T11:41:16.019+03:00"),
"name" : "Event 1",
"venue" : ObjectId("5e0471e3394d1e2b348b94aa")
}
当我们要删除Venue 1时,将发生以下错误,因为它有一个事件:
You cannot delete a venue because events are tied to it.
,状态码为400。
答案 1 :(得分:0)
用猫鼬和Expressjs的findOneAndDelete来做到这一点:
const express = require("express");
const router = express.Router();
router.delete("/:id", (req, res) => {
if (!mongoose.Types.ObjectId.isValid(req.params.id)) { //checking if id valid
return res.send("Please provide valid id");
}
var id = mongoose.Types.ObjectId(req.params.id); // passing it into a var
Event.findOneAndDelete({ venue: id }).then( res.json({ success: true }));
});
module.exports = router;
了解详情https://mongoosejs.com/docs/api/query.html#query_Query-findOneAndDelete
答案 2 :(得分:0)
exports.deleteVenue = asyncHandler(async (req, res, next) => {
//First check role. Because it not call database
if (req.user.role !== 'manager' && req.user.role !== 'admin') {
return next(new ErrorResponse(`Not authorized to delete venue`, 401));
}
//Next step, check event
const event = await Event.findById({ venue: ObjectId(req.params.id) });
if (event) {
return next(
new ErrorResponse(
`You cannot delete a venue because events are tied to it.`,
404
)
);
}
//Delete venue by Id
await Venue.deleteOne({ id: req.params.id }, (error, result) =>{
if(error) return next(
new ErrorResponse(`No venue with the id of ${req.params.id}`, 404)
);
res.status(200).json({
success: true,
data: {}
});
})
});