【问题标题】:How to use a second query in a Promise in JS ? using mysql db如何在 JS 的 Promise 中使用第二个查询?使用 mysql 数据库
【发布时间】:2022-01-03 16:06:42
【问题描述】:

基本上我有一个 createorder 需要将订单添加到数据库中,并将订单中的所有产品添加到 Orderline 额外表中。

一直在尝试不同的方法来使第二个查询工作,但唯一插入到数据库中的是来自第一个查询的数据。

第二个查询也需要使用第一个查询的插入顺序中的id。因为数据库对订单的 id 使用自动增量。

CreateOrder: (req) => {
        return new Promise((resolve, reject) => {
            const sqlInsert = 'INSERT INTO web3.orders (Created, firstName, lastName, street, number, postalCode, city, telephone, email, totalPrice) VALUES (?,?,?,?,?,?,?,?,?,?);';
            const sqlInsert2 = 'INSERT INTO web3.orderline (orderId,productId,qty,price) VALUES (?,?,?,?);';

            db.query(sqlInsert, [
                req.body.Created,
                req.body.firstName,
                req.body.lastName,
                req.body.street,
                req.body.number,
                req.body.postalCode,
                req.body.city,
                req.body.telephone,
                req.body.email,
                req.body.totalPrice],
                (err, result, fields) => {
                    if (err) {
                        reject(err);
                    }
                    else {
                        resolve(result);

                    }
                });
                db.query(sqlInsert2,
                    [
                        result.insertId,
                        req.body.producten.id,
                        req.body.producten.cartQuantity,
                        req.body.producten.price], (err, result, fields) => {
                            if (err) {
                                reject(err);
                            } else {
                                resolve(result);
                            }
                        });
                    });
                },
            }

【问题讨论】:

    标签: javascript mysql node.js reactjs promise


    【解决方案1】:

    您需要两个承诺:每个查询一个。只有在第一个解决后,才应创建第二个。

    一个很好的方法是promisify db.query 到一个新函数中,然后只使用那个函数。所以先定义这个:

    const promiseQuery = (sql, params) => new Promise((resolve, reject) =>
        db.query(sql, params, (err, result, fields) => err ? reject(err) : resolve(result))
    );
    

    其次,您可以将CreateOrder 设为async 函数,以便您可以使用await

    async CreateOrder: (req) => {
        const sqlInsert = 'INSERT INTO web3.orders (Created, firstName, lastName, street, number, postalCode, city, telephone, email, totalPrice) VALUES (?,?,?,?,?,?,?,?,?,?);';
        const sqlInsert2 = 'INSERT INTO web3.orderline (orderId,productId,qty,price) VALUES (?,?,?,?);';
        let result = await promiseQuery(sqlInsert, [
            req.body.Created,
            req.body.firstName,
            req.body.lastName,
            req.body.street,
            req.body.number,
            req.body.postalCode,
            req.body.city,
            req.body.telephone,
            req.body.email,
            req.body.totalPrice
        ]);
        await promiseQuery(sqlInsert2, [
            result.insertId,
            req.body.producten.id,
            req.body.producten.cartQuantity,
            req.body.producten.price
        ]);
    }
    

    【讨论】:

    • 好像不行,和以前一样,只是在orderline表中添加订单而不是数据
    • 上述流程是否有错误或第二次查询没有执行? @kennycallens
    • @SmritiShikha 第一个订单被执行,它只显示 POST /order500。第一个查询的信息也被插入到数据库中。
    • 您使用的数据库 API 是什么 (db)?调试(逐步执行,检查,......)给你什么?这些INSERT 语句在直接通过数据库的本机用户界面执行时是否有效(具有相同的值)?
    • @trincot mysql workbench gyazo.com/55c921231fba97254410cfcb351da182 erm im 使用 Visual Studio 代码,这是我的第一个 js 项目,但当我手动插入时,我认为没有像 vs2019 和 c# 中那样的逐步调试器它们具有相同的值gyazo.com/821323d8b7eb6f12ac55bcc76e5462ec
    【解决方案2】:

    上面的代码是正确的,同样的流程在这里工作

    async function CreateOrder(req) {
        const sqlInsert = 'INSERT INTO legs (leg) VALUES (?);';
        const sqlInsert2 = 'INSERT INTO destinations (destination,area) VALUES (?,?);';
        let result = await promiseQuery(sqlInsert, [
            "lw"
        ]);
      let res=   await promiseQuery(sqlInsert2, [
            "test",
            "test location"
        ]);
        console.log(res)
    }
    
    const promiseQuery = (sql, params) => new Promise((resolve, reject) =>
        db.query(sql, params, (err, result, fields) => err ? reject(err) : resolve(result))
    );
    async function test(){
       await CreateOrder()
    }
    

    尝试检查是否有任何键未定义或字段类型与您传递的值不匹配

    如果你 req.body.producten 是一个数组你必须为每次迭代做查询

    async CreateOrder: (req) => {
        const sqlInsert = 'INSERT INTO web3.orders (Created, firstName, lastName, street, number, postalCode, city, telephone, email, totalPrice) VALUES (?,?,?,?,?,?,?,?,?,?);';
        const sqlInsert2 = 'INSERT INTO web3.orderline (orderId,productId,qty,price) VALUES (?,?,?,?);';
        let result = await promiseQuery(sqlInsert, [
            req.body.Created,
            req.body.firstName,
            req.body.lastName,
            req.body.street,
            req.body.number,
            req.body.postalCode,
            req.body.city,
            req.body.telephone,
            req.body.email,
            req.body.totalPrice
        ]);
        for (let ele of req.body.producten){
            await promiseQuery(sqlInsert2, [
               result.insertId,
               ele.id,
               ele.cartQuantity,
               ele.price
            ]);
        }
    }
    

    【讨论】:

    • 第二个查询值是数组的成员(result.insertId、req.body.producten.id、req.body.producten.cartQuantity、req.body.producten.price),但值是交付它在这里说:gyazo.com/93aa4c1a0f4ac50cf93978fe31fd5697
    • 你想将数组的所有元素作为新行插入到mysql中吗?
    【解决方案3】:

    试试这个:

    CreateOrder: (req) => {
            const { Created, firstName, lastName, street, number, postalCode, city, telephone, email, totalPrice } = req.body
            let results = {}
            return new Promise((resolve, reject) => {
                const sqlInsert = 'INSERT INTO web3.orders (Created, firstName, lastName, street, number, postalCode, city, telephone, email, totalPrice) VALUES (?,?,?,?,?,?,?,?,?,?);';
                const sqlInsert2 = 'INSERT INTO web3.orderline (orderId,productId,qty,price) VALUES (?,?,?,?);';
    
                db.query(sqlInsert, [Created, firstName, lastName, street, number, postalCode, city, telephone, email, totalPrice],
                    (err, result, fields) => {
                        console.log(result)
                        results.insertId = result.id
                    });
                db.query(sqlInsert2, [ results.insertId, req.body.producten.id, req.body.producten.cartQuantity, req.body.producten.price], (err, result, fields) => {
                                if (err) {
                                    reject(err);
                                } else {
                                    resolve(result);
                                }
                            });
                        });
                    },
                }
    

    我猜在您的初始代码中,您正在解决第一个 db.query 中的承诺,这导致承诺结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 2011-01-20
      • 2015-03-09
      • 2018-02-01
      • 2015-08-30
      • 2015-07-23
      相关资源
      最近更新 更多