Node.js Sequelize:如何在for循环执行完后调用findAll方法?
问题排查与修复
核心原因
你遇到的问题是异步操作未等待完成:循环里的newUser_Paper.save()是异步Promise操作,for循环不会等待这些save全部执行完毕就直接调用了findOne,此时数据库还没完成所有User_Paper数据的插入,所以查询返回null。
另外代码里还有两处细节错误:
- 模型名大小写不一致:创建实例用的是
User_Paper,查询却写成了User_paper,Sequelize对模型名大小写敏感,会导致找不到模型 - 查询条件里的
paperId字段值错误:应该用new_paper.id而非new_paper.paperId,Paper表的主键是id,保存后的实例用id获取主键值
修复后的代码
const newPaper = new Paper({ title, abstract, contributor: authors, // 原代码重复定义了contributor,这里保留正确的authors赋值 paper_file: file, paper_topicId: ptopic.id, categoryId: c1.id, postingDate, postingTime }); newPaper.save().then(new_paper => { // 收集所有save操作的Promise const savePromises = []; for (let i = 0; i < new_paper.contributor.length; i++) { const newUser_Paper = new User_Paper({ userId: null, username: new_paper.contributor[i], paperId: new_paper.id, }); // 将save的Promise加入数组 savePromises.push(newUser_Paper.save()); } // 等待所有save操作完成后再执行查询 Promise.all(savePromises).then(() => { User_Paper.findOne({ // 修正模型名大小写 where: { username: 'Touhid', paperId: new_paper.id // 修正paperId的值 } }).then(x => { console.log(x); }).catch(err => { // 加上错误捕获,方便排查查询问题 console.error('查询出错:', err); }); }).catch(err => { console.error('保存User_Paper出错:', err); }); }).catch(err => { console.error('保存Paper出错:', err); });
额外优化建议
可以用async/await替代链式then,代码可读性更好:
async function createPaperAndRelations() { try { const newPaper = await Paper.create({ // 用Model.create替代new+save,更简洁 title, abstract, contributor: authors, paper_file: file, paper_topicId: ptopic.id, categoryId: c1.id, postingDate, postingTime }); const savePromises = newPaper.contributor.map(username => { return User_Paper.create({ // 同样用create userId: null, username, paperId: newPaper.id, }); }); await Promise.all(savePromises); const result = await User_Paper.findOne({ where: { username: 'Touhid', paperId: newPaper.id } }); console.log(result); } catch (err) { console.error('操作出错:', err); } } // 调用函数 createPaperAndRelations();
内容的提问来源于stack exchange,提问作者Shabnam Sabah
相关产品推荐
相关产品推荐

