如何在 Node 中使用 Mysql2 使用 async 和 pool 获取 MySQL 的 insertId?

Hej*_*123 9 mysql connection-pooling node.js mysql2 async-await

我正在尝试将 async wait 与 mysql2 和池一起使用,但我认为我做错了。下面是我的代码(正如我所说,我不确定我是否在这里做事)。

    const pool = mysql.createPool({
      host: 'localhost',
      user: 'root',
      database: 'test',
      password: '',
      waitForConnections: true,
      connectionLimit: 10,
      queueLimit: 0
    });
    
    const promisePool = pool.promise();   // Get a Promise wrapped instance of that pool   
    

app.post('/api/register', (req, res) => {

    async function queryDB() {
    
        try {
          const addUser = await promisePool.execute(
            "INSERT INTO users (company, email, password) VALUES (?,?,?)",
            ['Ikea', 'Ikea@ikea.com', '123'],
          )
          const addAnother = await promisePool.execute(
            "INSERT INTO users (company, email, password) VALUES (?,?,?)",
            ['Google', 'Google@google.com', '123']
          )
    
          console.log(addUser)
          res.status(200).json('Users saved')
          
        } catch (err) {
          console.log(err)
          res.status(409).json('User already exist')
        };
      }
    
      queryDB();
})
Run Code Online (Sandbox Code Playgroud)

这个想法是应该保存“addUser”,如果它不唯一,则会发生错误(因为SQL数据库电子邮件列设置为唯一),然后addAnother将不会开始插入。

我不明白的是如何从 addUser 插入中获取 insertId ?我将需要它来进行第二次插入。如果我 console.log addUser 我可以看到这样的对象:

ResultSetHeader {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 72,
  info: '',
  serverStatus: 2,
  warn
Run Code Online (Sandbox Code Playgroud)

所以 insertId 被发送回给我,但我似乎无法到达它。如果我尝试抓住它,它会说无法读取未定义的属性。我觉得我做的这一切都是错误的,那么我应该如何做才能获取 insertID 呢?

Hej*_*123 10

看起来结果是在一个数组中。我用以下方法解决了它addUser[0].insertId:但我从来没有让 LAST_INSERT_ID() 工作。


O. *_*nes 5

如果您将多行插入到同一个表中,并且该表具有AUTO_INCREMENT主键样式列,则服务器会为您分配值。您不需要知道insertId插入的第一行的值即可正确插入第二行。

您需要的值insertId位于addUser.insertId.

          const addUser = await promisePool.execute(
            "INSERT INTO users (company, email, password) VALUES (?,?,?)",
            ['Ikea', 'Ikea@ikea.com', '123'],
          )
          const theInsertIdForAddUser = addUser.insertId
Run Code Online (Sandbox Code Playgroud)

但请注意,它也可以通过 SQL LAST_INSERT_ID() 函数在下一个 MySQL 语句中直接检索。这可以让你做这样的操作。

   INSERT INTO users_properties 
           (key, value, userId)
    VALUES ('tel','555-1212',LAST_INSERT_ID());
Run Code Online (Sandbox Code Playgroud)

您不必将值发回。