当我在 Express JS 应用程序中 app.post 时如何获得自动增量值?

How to get auto-incremented value when I app.post in ExpressJS app?

我有一个数据表,用户在参加测试之前输入他们的名字、姓氏和电子邮件。数据 table 有一个 Student_id 列,它会自动递增每个新用户。我的问题是试图弄清楚如何在用户提交表单后获取 Student_id 号码,因此我可以将其存储在我的 Express 应用程序的变量中,最终 post 将该号码转换为另一个数据 table 跟踪当前用户。

我尝试了以下但没有成功(很可能做错了):

SCOPE_IDENTITY()

LAST_INSERT_ID

app.use(bodyParser.urlencoded({ extended: true }));
app.post('/user-info', (req, res) => {

    var first_name = req.body.first_name;
    var last_name = req.body.last_name;
    var email = req.body.email;

    var sql = `INSERT INTO Govt_profiles (First_Name, Last_Name, Email)
        SELECT ?, ?, ? 
        WHERE NOT EXISTS (SELECT 1 FROM Govt_profiles WHERE Email = ?)`;


    pool.query(sql, [first_name, last_name, email, email], (err, data) => {
        if (err) throw err;
    });
    res.redirect('/questions');

});

我能够 post 我的数据没有问题,我只是不知道如何获得那个 Student_id 号码。

我尝试了以下但没有成功(很可能做错了):SCOPE_IDENTITY()LAST_INSERT_ID

你必须 select 最后插入的 id

SELECT LAST_INSERT_ID()

另一种方式,但不是最好的。

通过知道Student_id是auto_increment值,可以用这句话:

 SELECT `Student_id` FROM `Govt_profiles` WHERE Student_id=(SELECT MAX(Student_id) FROM `Govt_profiles`);

如果您正在使用节点模块 mysql,您应该能够使用 results.insertId

来自Getting the id of an inserted row

If you are inserting a row into a table with an auto increment primary key, you can retrieve the insert id like this:

connection.query('INSERT INTO posts SET ?', {title: 'test'}, function (error, results, fields) {
  if (error) throw error;
  console.log(results.insertId);
});

在 sql 中,您将字段配置为自动递增,无需插入该字段值。在每次插入时,它都会自动增加值。通常对于主键,我们在 table 创建期间配置 AUTO_INCREMENT。

CREATE TABLE <tablename>(
id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
PRIMARY KEY (id));

然后我们设置一个最低级别,值应该从这个级别开始

ALTER TABLE <table name> AUTO_INCREMENT=9000;

因此您可以执行如下插入查询

INSERT INTO <tablename>(FirstName,LastName)
VALUES ('Foo','Bar');

我相信您的问题不在于查询。这与 Node.js 的工作原理有关。您似乎没有在等待 post 返回的信息。使用 promise 或 async/await 函数尝试 运行 它。

http://www.acuriousanimal.com/2018/02/15/express-async-middleware.html

app.post('/用户信息', async (req, res) => {

var first_name = req.body.first_name;
var last_name = req.body.last_name;
var email = req.body.email;

var sql = `INSERT INTO Govt_profiles (First_Name, Last_Name, Email)
    SELECT ?, ?, ? 
    WHERE NOT EXISTS (SELECT 1 FROM Govt_profiles WHERE Email = ?)`;

await pool.query(sql, [first_name, last_name, email, email], (err, data) => {
    if (err) throw err;
});

// await getIdSQL = `SELECT LAST_INSERT_ID()`
// if successful - send result 
// if failure - send error

});

在客户端,使用提取 API 或 AJAX 来捕获消息并在成功时重定向。

要么使用默认的 promise 实现创建池 (require('mariadb');),然后使用

try {
   const res = await pool.query(sql, [first_name, last_name, email, email]);
   return res.insertId;
} catch(err) {
    //do something with error;
}

或者如果池使用回调实现 (require('mariadb/callback');) 则使用

pool.query(sql, [first_name, last_name, email, email], (err, data) => {
    if (err) throw err;
    //do something with `data.insertId`
});

好吧,在继续讨论这个问题后我终于弄明白了。感谢大家的帮助,这是我的解决方案。

app.use(bodyParser.urlencoded({ extended: true }));
app.post('/user-info', (req, res) => {

var first_name = req.body.first_name;
var last_name = req.body.last_name;
var email = req.body.email;

var sql = `INSERT INTO Govt_profiles (First_Name, Last_Name, Email)
    SELECT ?, ?, ? 
    WHERE NOT EXISTS (SELECT 1 FROM Govt_profiles WHERE Email = ?);
    SELECT LAST_INSERT_ID()`;

pool.query(sql, [first_name, last_name, email, email], (err, data) => {
    if (err) throw err;
})
.then(rows => {
    console.log(rows[0].insertId);//<-----here's the freaking last insertId !!!!!!
})
.catch(err => {
    console.log(err);
})

});