猫鼬承诺和节点,更早返回响应



我正在做一个MERN堆栈项目。我看到在服务器端与mongodb中获取或保存数据相关的一些函数有很多回调。为了避免回调地狱,现在我正在尝试基于承诺的解决方案。然而,我遇到了这个基于承诺的解决方案的问题。我有一个条件,根据它的值,我要么继续执行,要么返回响应并停止。

const mId = req.body.mId;
const cId = req.body.cId;
const lId = req.body.lId;
LP.findOne({
'userId': lId,
'courseId': cId
})
.then( lP => {
return lP.materials;
})
.then( materials => {
if( materials.includes(mId) ) {
console.log('A')
return res.json({'status': 'success'})
}
else {
materials.push(materialId)
return LP.findOneAndUpdate({
'userId': learnerId,
'courseId': courseId
}, {
$set: { materials: materials}
}, {
new: true
})
}
})
.then( update => {
console.log('B')
return res.json({ 'status': 'success' })
})
.catch( err => {
return res.json({ 'status': 'fail' })
})

在上面的代码中,A被打印后B也被打印,进一步的代码被执行,这给了我:不能设置头后,他们被发送到客户端错误。我认为这就是承诺应该起作用的方式。但是,避免这个问题的可能解决方案是什么呢?如何尽早返回res并且不再执行代码。

感谢

只要不返回停止链:

const mId = req.body.mId;
const cId = req.body.cId;
const lId = req.body.lId;
LP.findOne({
'userId': lId,
'courseId': cId
})
.then( lP => {
return lP.materials;
})
.then( materials => {
if( materials.includes(mId) ) {
console.log('A')
res.json({'status': 'success'})
}
else {
materials.push(materialId)
return LP.findOneAndUpdate({
'userId': learnerId,
'courseId': courseId
}, {
$set: { materials: materials}
}, {
new: true
})
}
})
.then( update => {
console.log('B')
res.json({ 'status': 'success' })
})
.catch( err => {
res.json({ 'status': 'fail' })
})