[英]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()
在 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.