节点JSSQL事务REST
我已经用express.js实现了一个REST API。我用它来连接我的数据库。数据库必须包含多个表。一个是餐桌上的人,另一个叫宠物节点JSSQL事务REST,sql,node.js,Sql,Node.js,我已经用express.js实现了一个REST API。我用它来连接我的数据库。数据库必须包含多个表。一个是餐桌上的人,另一个叫宠物 app.post('/persons', (req, res, next) => { let firstname = req.body.firstname; let lastname = req.body.lastname; let petname = req.body.petname; if (!firstname) { return res.
app.post('/persons', (req, res, next) => {
let firstname = req.body.firstname;
let lastname = req.body.lastname;
let petname = req.body.petname;
if (!firstname) {
return res.status(400).send({ error: true, message: 'Please provide first name' });
}else if (!lastname) {
return res.status(400).send({ error: true, message: 'Please provide last name' });
}else if (!petname) {
return res.status(400).send({ error: true, message: 'Please provide pet name' });
}
当我调用这个post方法时,我想检查数据库中是否已经存在某个petname。如果是这样,那么获取petID并将其与人名和姓氏一起插入Person表中,以便将人与宠物链接。如果此宠物名不存在,则在表pet中使用此名称和新id创建一个新宠物。然后再次将id、名字和姓氏保存到表Person。所以每个宠物名应该只存在一次
我知道如何将此人写入数据库:
Conn.query("INSERT INTO Person SET ? ", { FirstName: firstname, LastName: lastname, PetID: petid }, function (error, results, fields) {
if (error) throw error;
return res.send({ error: false, data: results, message: 'New person has been created successfully.' });
});
但是现在我仍然需要petID,如果有,如果没有,在DB中创建一个新的宠物并返回id。
我该怎么做?我认为在创建事务之前检查是您的选择 如果宠物存在,你将得到它的id,如果没有-创建新的宠物,并获得id 我为psql编写了一个小sql脚本:
WITH pet AS (
WITH new_row AS (
INSERT INTO Pets (id)
SELECT '{id}' WHERE NOT EXISTS (SELECT * FROM Pets WHERE id = '{id}')
RETURNING *
)
SELECT * FROM new_row
UNION
SELECT * FROM Pets WHERE id = '{id}' LIMIT 1
RETURNING *
)
INSERT INTO Person SET pet_id=pet.id;
下一步是为person创建事务。现在你已经有了你的宠物id。所以我尝试了这个,但它不起作用
Conn.beginTransaction(function(error){
if (error) throw error;
Conn.query('Select PetID FROM Pet WHERE Petname = ' + mysql.escape(petname), function (error, results, fields){
if (error) {
connection.rollback(function() {
throw error;
});
}
else {
if (!results) {
Conn.query('INSERT INTO Pet SET ? ', { Petname: petname }, function (error, results, fields){
if (error) {
connection.rollback(function() {
throw err;
});
}
return res.send({ error: false, data: results, message: 'New pet has been created successfully.' });
});
}
let petid = results.insertId;
Conn.query('INSERT INTO Person SET ? ', { FirstName: firstname, LastName: lastname, PetID: petid}, function (error, results, fields){
if (error) {
connection.rollback(function() {
throw error;
});
}
Conn.commit;
return res.send({ error: false, data: results, message: 'New person has been created successfully.' });
});
}
});
});
这笔交易有什么问题