PERN栈遍历数据数组时数据库POST请求未全部执行问题
问题排查与修复方案
前端代码问题点
- 你写的
whatever.then(console.log("I hate my life."))完全错误:await Promise.all已经把Promise解析成了普通值,whatever不是Promise对象,而且console.log会直接执行,根本不会等异步操作完成。修正后的代码:const createEntry = async function (data) { await Promise.all( data.map(async (item) => { try { console.log(`正在插入: ${item.name}`); const response = await Entry.post("/", item); console.log(`插入成功: ${item.name}`, response.data); } catch (err) { // 打印完整错误,包括后端返回的详情 console.error(`插入失败: ${item.name}`, err.response?.data || err.message); } }) ); console.log("所有插入请求处理完毕"); }; - 原代码的错误捕获太简略,只打印
err看不到关键信息,Axios的错误对象里response.data会包含后端返回的错误详情,必须打出来才能定位问题。
后端代码问题点
- 表名是PostgreSQL保留关键字:
database是PG的内置关键字,直接写会触发SQL语法错误,必须用双引号包裹表名,同时加上RETURNING *才能拿到插入后的记录(否则results.rows是空数组):app.post("/url", async (req, res) => { try { const results = await db.query( 'INSERT INTO "database" (id, name) VALUES ($1, $2) RETURNING *', [req.body.id, req.body.name] ); res.send({ status: "success", results: results.rows.length, data: { entry: results.rows[0], }, }); } catch (err) { // 打印完整错误,不要只打detail console.error(`插入${req.body.name}失败:`, err); // 给前端返回错误响应,避免请求超时 res.status(500).send({ status: "error", message: err.message }); } }); - 原后端catch块没有给前端返回错误响应,导致前端请求超时,这也是部分请求看起来"没成功"的原因之一。
最可能的核心原因
- 主键/唯一约束冲突:如果你的
id字段是主键或有唯一约束,数组里只要有重复的id,PG就会拒绝插入,后端会捕获到约束错误,但原代码没把错误返回给前端,你也没看到完整日志。先检查数组里的id是不是全唯一。 - 数据库连接池限制:PG默认连接池最大连接数是10,你一次性发24个请求,超过部分会排队等待,超时后就失败了。要么调整连接池配置,要么改成批量插入(把数组分成几批,或者后端写一个批量插入的接口)。
验证步骤
- 查看后端控制台的错误日志,确认是否有约束违反、SQL语法错误的信息。
- 查看前端控制台的完整错误输出,确认哪些请求失败,失败原因是什么。
- 检查数组中的数据是否符合数据库表的约束:比如
id唯一、name非空、字段长度不超限等。
内容的提问来源于stack exchange,提问作者Shannon Rose
相关产品推荐
相关产品推荐

