Node.js 使用Async/Await和数组映射将数据插入postgres表

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": [ {

我对承诺不熟悉,不确定我在下面的代码中缺少了什么,因为不幸的是,我的req.body作业组没有插入到我的postgres表中

在我的index.js express代码中,我有以下内容。仅供参考,部分代码已被省略

req.body的值为:

{
    "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使用
具有异步/等待
的池客户端?是的。除非出于某种原因您不想使用事务?