当我在 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);
})
});
我有一个数据表,用户在参加测试之前输入他们的名字、姓氏和电子邮件。数据 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);
})
});