Node.js 使用Async/Await和数组映射将数据插入postgres表
我对承诺不熟悉,不确定我在下面的代码中缺少了什么,因为不幸的是,我的req.body作业组没有插入到我的postgres表中 在我的index.js express代码中,我有以下内容。仅供参考,部分代码已被省略 req.body的值为:Node.js 使用Async/Await和数组映射将数据插入postgres表,node.js,postgresql,express,async-await,promise,Node.js,Postgresql,Express,Async Await,Promise,我对承诺不熟悉,不确定我在下面的代码中缺少了什么,因为不幸的是,我的req.body作业组没有插入到我的postgres表中 在我的index.js express代码中,我有以下内容。仅供参考,部分代码已被省略 req.body的值为: { "jobName": "ABC", "jobType": "1", "jobGroups": [ {
{
"jobName": "ABC",
"jobType": "1",
"jobGroups": [
{
"jobGroupName": "A1",
},
{
"jobGroupName": "B2",
}
]
}
当我从客户端调用我的route/process job
时,我看到记录是在我的my_jobs
表中创建的,但在处理my_job_groups
表时,没有插入任何内容
我基本上需要使用从my\u jobs
insert返回的job\u id在my\u job\u组中创建A1和B2
不确定我是否正确使用了承诺和异步/等待
const express = require("express");
const app = express();
const cors = require("cors");
const pool = require("./db");
app.post("/process-job", async (req, res) => {
try {
const { jobName, jobType } = req.body
const jobDetails = req.body.jobGroups;
const theJob = await pool.query(
"INSERT INTO my_jobs (job_name, job_type) VALUES($1, $2) RETURNING job_id",
[ jobName, jobType ]
);
let jobId = theJob.rows[0];
try {
const promises = jobDetails.map(async jobDetail => {
let newJob = await pool.query(
"INSERT INTO my_job_groups (job_id, job_group_name) VALUES($1, $2) RETURNING job_group_id",
[ jobId, jobDetails.jobGroupName ]
);
return {
id: newJob.rows[0]
}
})
const results = await Promise.all(promises)
} catch(err) {
console.error(err.messasge);
}
} catch(err) {
console.error(err.messasge);
}
})
只需将所有代码包装成一个try/catch
块就足够了。当插入到my\u job\u group
时,job\u group\u name
应该是jobdail.jobGroupName
,而不是jobdails.jobGroupName
而且,我认为如果您的API向客户机返回响应应该更好
const express = require("express");
const app = express();
const cors = require("cors");
const pool = require("./db");
app.post("/process-job", async (req, res) => {
try {
const { jobName, jobType, jobGroups: jobDetails } = req.body // destruct to get all properties
const job = await pool.query(
"INSERT INTO my_jobs (job_name, job_type) VALUES($1, $2) RETURNING job_id",
[jobName, jobType],
);
const jobId = job.rows[0];
const promises = jobDetails.map(async jobDetail => {
const newJob = await pool.query(
"INSERT INTO my_job_groups (job_id, job_group_name) VALUES($1, $2) RETURNING job_group_id",
[jobId, jobDetail.jobGroupName] // jobDetail.jobGroupName instead of jobDetails.jobGroupName
);
return {
id: newJob.rows[0],
};
});
const result = await Promise.all(promises);
res.json(result);
} catch (err) {
console.error(err); // print out message object
res.status(500).json({ message: err.message }); // response with status 500
}
});
看起来不错,有什么问题吗?嵌套的try
块似乎不必要,您可能希望返回适当的http响应。顺便说一句,您可能希望使用单个池客户端(每个请求)而不是每个查询一个客户端(使用pool.query
)。@Bergi-您能解释一下您的确切意思吗wrt“您可能希望使用单个池客户端(每个请求)而不是每个查询一个客户端(使用pool.query)”?请参阅和。@Bergi-由于我将执行上述多个查询,其中我需要在我的作业中使用作业id
,作为我对我的作业组的另一个插入查询的一部分,因此我实际上是否应该按照doco使用具有异步/等待的池客户端?是的。除非出于某种原因您不想使用事务?