Node.js 在express中发布多对多请求
我有两个表:user和material,它们具有m:m关系。相交实体是日记材料。我正试图发送一个POST请求,以便在日记材料中插入内容。此外,此表有2个属性:recycledQuantity和recycleDate。我尝试了一些东西,但如果我插入了一个不存在的物质,它不会给我找不到Node.js 在express中发布多对多请求,node.js,rest,express,post,sequelize.js,Node.js,Rest,Express,Post,Sequelize.js,我有两个表:user和material,它们具有m:m关系。相交实体是日记材料。我正试图发送一个POST请求,以便在日记材料中插入内容。此外,此表有2个属性:recycledQuantity和recycleDate。我尝试了一些东西,但如果我插入了一个不存在的物质,它不会给我找不到 app.post('/users/:uid/materials/:mid', (req, res, next) => { User.findById(req.params.uid) .then((
app.post('/users/:uid/materials/:mid', (req, res, next) => {
User.findById(req.params.uid)
.then((user) => {
if (user){
let journalMaterial = req.body
journalMaterial.userId = user.id
Material.findById(req.params.mid)
.then((material) => {
if (material){
journalMaterial.materialId = material.id
return JournalMaterial.create(journalMaterial)
}
else{
res.status(404).send('not found')
}
})}
else{
res.status(404).send('not found')
}
})
.then(() => {
if (!res.headers){
res.status(201).json('created')
}
})
.catch((err) => next(err))
})
稍微重写一下,让它更具可读性。已删除嵌套的承诺调用。。。当他们试图摆脱地狱的时候,我们不要陷入地狱
app.post('/users/:uid/materials/:mid', (req, res, next) => {
const { journalMaterial } = req.body;
const { uid, mid } = req.params;
Promise.all([
User.findById(uid),
Material.findById(mid)
])
.then(([user, material]) => {
if (user && material) {
journalMaterial.userId = user.id;
journalMaterial.materialId = material.id;
return JournalMaterial.create(journalMaterial);
}
res.status(404).send('not found');
})
.then(() => {
if (!res.headers) {
res.status(201).json('created');
}
})
.catch(err => next(err));
});
您对ifuser的检查当前通过。看起来,如果是这样的话,你总是能找回一个物体。许多数据库通常不会简单地返回null或false值,而是返回一个包含大量元数据的对象。在该对象中,通常是您请求的数据,即user.data.id,但可能是user.data为NULL。你能确认用户的确切内容是什么吗?它的评估是真实的,因此它一定有什么东西在里面。我已经解决了它。这是正确的代码
app.post('/users/:uid/materials/:mid', (req, res, next) => {
const { uid, mid } = req.params;
Promise.all([
User.findById(uid),
Material.findById(mid)
])
.then(([user, material]) => {
if (user && material) {
let journalMaterial = req.body
journalMaterial.userId = user.id
journalMaterial.materialId = material.id
res.status(201).json('created')
return JournalMaterial.create(journalMaterial)
}
res.status(404).send('not found')
})
.catch(err => next(err));
})
如果我插入一个不存在的materialId,它不会给我“未找到”-是的,这正是你这里的代码将要做的。问题是,如果它在db中查找id为2的eg材料,但没有找到,它应该进入else分支,给出未找到并退出,但我不明白他为什么不这样做…我误读了,我以为你说你找不到-那会发生什么?更清楚地说,我插入了一个userId=1的用户和一个materialId=1的材料,所以我没有更多的用户或材料,所以如果我发送userId=1和materialId=2的POST方法,我应该找不到,因为我没有materialId=2的材料,但是我被创建了,服务器给出了错误:未处理的拒绝错误:发送邮件后无法设置邮件头。感谢您重新编写!这更贴切,但不幸的是,它给了我一个错误:TypeError:无法在Promise.all设置undefined的属性“userId”。那是因为您的journalMaterial在您的请求正文中不存在谢谢!我在第一个if之后声明了let journalMaterial=req.body。现在,如果我给出的ID不存在,它会给出“找不到”,这很好,但它也会在服务器中给我一个错误:错误:发送头后无法设置头。您是否尝试过调试代码以查看实际情况?试着先这样做:它肯定会告诉你发生了什么。