节点JSSQL事务REST

节点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.

我已经用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.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.' });    
            });
        }
    });
});
这笔交易有什么问题