问题描述
我的项目有2个相互参照的模型.当删除一个模型的实例时,remove()
方法将钩住另一个模型以删除依赖关系.
photo.model.js
const Album = require('./album');
.
.
// post hook of photo.remove()
schema.post('remove', (photo, next) => {
console.log(Album); // return empty obj {}
Album.findById(photo._album, (error, album) => {
// find album and remove photo
});
});
删除里面的相册模型钩子返回空对象.我通过在钩子内部移动require语句找到了解决方法.
schema.post('remove', (photo, next) => {
const Album = require('./album');
Album.findById(photo._album, (error, album) => {
// find album and remove photo
});
});
但是该修复程序对我来说很难看,我的猜测是每次调用photo.remove()
时都会调用require
语句.
问题:
- 我上面关于每次调用
photo.remove()
都会被调用require
"的猜测是否正确? - 为什么不能将
require
放置在钩子外部并且与内部行为相同? - 无论如何,我可以将
require
放置在钩子外部并获得与放置在钩子中相同的行为吗?
听起来像您有周期性依赖关系,其中photo.model.js
需要album.js
,而photo.model.js
需要... c
要解决此问题,可以使用以下方法:
const mongoose = require('mongoose');
schema.post('remove', (photo, next) => {
mongoose.model('Album').findById(photo._album, (error, album) => {
// find album and remove photo
});
});
My project has 2 models referring to one another. When the instances of one model are removed, remove()
method will hook another model to remove the dependencies.
photo.model.js
const Album = require('./album');
.
.
// post hook of photo.remove()
schema.post('remove', (photo, next) => {
console.log(Album); // return empty obj {}
Album.findById(photo._album, (error, album) => {
// find album and remove photo
});
});
Album model inside remove hook return empty object. I found the fix by moving require statement inside the hook.
schema.post('remove', (photo, next) => {
const Album = require('./album');
Album.findById(photo._album, (error, album) => {
// find album and remove photo
});
});
But the fix looks ugly to me and my guess is every time photo.remove()
is called require
statement is called.
Question:
- Is my guess above about "
require
getting called every timephoto.remove()
is called" correct? - Why can't I place the
require
outside the hook and having same behavior as inside? - Is there anyway I can place
require
outside the hook and get the same behavior as placing it inside?
It sounds like you have a cyclic dependency, where photo.model.js
requires album.js
which requires photo.model.js
, ...
To work around that, you can use this:
const mongoose = require('mongoose');
schema.post('remove', (photo, next) => {
mongoose.model('Album').findById(photo._album, (error, album) => {
// find album and remove photo
});
});
这篇关于猫鼬模型是另一个模型的后挂钩内的空对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!