繁体   English   中英

当我在 ExpressJS 应用中使用 app.post 时,如何获取自动递增的值?

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

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

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

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');

});

我可以毫无问题地发布我的数据,只是不知道如何获取该 Student_id 编号。

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

您必须选择最后一个插入 ID,例如

SELECT LAST_INSERT_ID()

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

获取插入行的 id

如果您将一行插入到带有自动递增主键的表中,您可以像这样检索插入 ID:

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

在 sql 中,您将该字段配置为自动递增,无需插入该字段值。 在每次插入时,它将自动采用递增值。 通常对于主键,我们在表创建期间配置 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 的工作方式有关。 您似乎没有在等待帖子返回的信息。 尝试使用 promise 或 async/await 函数运行它。

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

app.post('/user-info', 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

});

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

池是使用默认承诺实现( 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);
})

});

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM