【问题标题】:ExpressJS - Javascript doesn't seem to execute from top-downExpressJS - Javascript 似乎不是自上而下执行的
【发布时间】:2021-11-27 03:41:00
【问题描述】:

我有这个脚本似乎没有运行。我在变量重新分配方面注意到了这一点。显示代码片段和输出

//Create New Open Market under the game
            let latestRowId = 1;
            var sqlQuery2 = "SELECT ID FROM markets ORDER BY LAST_EDITED DESC LIMIT 1";
            db.query(sqlQuery2, [], function(err, result4) {
                if (err){
                    console.log("Error during /openBetoBetoMarket. Proc_4" + err);
                    res.status(500).json({ msg: "Server Error /openBetoBetoMarket. gameID:" + gameID });
                } else {
                    console.log("result4", result4[0].ID)
                    latestRowId = result4[0].ID
                }
            });
            console.log("latest_row_id", latestRowId);
            
            newRowID = latestRowId + 1
            newMarketId = result[0].MARKET_ID + 1
            newGameId = gameID
            newDescription = gameTitle
            console.log("New row id", newRowID, "new market id", newMarketId)

            sqlQuery = "INSERT INTO markets (ID, MARKET_ID, GAME_ID, DESCRIPTION, LAST_EDITED, WRITER) VALUES (?, ?, ?, ?, NOW(), CURRENT_USER);"
            db.query(sqlQuery, [newRowID, newMarketId, newGameId, newDescription], (err, result4) => {
                if (err){
                    console.log("Error during /openBetoBetoMarket. Proc_5 " + err);
                    res.status(500).json({ msg: "Server Error /openBetoBetoMarket. gameID:" + gameID });
                } else if (result4.affectedRows > 0){
                    console.log("Created new open market for /openBetoBetoMarket. MarketID: " + newMarketId);
                    res.status(200).json({msg: "Created New Open Market", marketID: newMarketId, isOpen: 1})     
                } else {
                    console.log("Error during /openBetoBetoMarket. Proc_5. Inserted but no affected Rows");
                    res.status(500).json({ msg: "Server Error /openBetoBetoMarket. gameID:" + gameID });
                }
            })

输出如下:

latest_row_id 1
新行 id 2 新市场 id 3
结果4 2
/openBetoBetoMarket 期间出错。 Proc_5 错误:ER_DUP_ENTRY:键“markets.PRIMARY”的重复条目“2”

如您所见,它似乎跳过了第一个 db.query 并直接进入下一个变量赋值,然后执行第一个 db.query。知道我在这里缺少什么吗?第一次在这里发帖。谢谢

【问题讨论】:

  • 我建议搜索“非阻塞异步 Javascript”并阅读。这里的关键是db.query() 是非阻塞的。它在调用它的回调之前返回,它会在稍后的某个时间调用它的回调,在其他代码执行之后很久。这是 Javascript 中非阻塞、异步 I/O 的关键和基本原则,学习和理解很重要。

标签: javascript mysql node.js express


【解决方案1】:

您定义(或根本不定义)变量的方式正在给您带来麻烦。

首先,放弃var 关键字。绝对没有理由使用它。 var 在全局范围内定义变量并允许重新分配它们。你真的不应该使用全局变量,除非最小的脚本永远不会被显着改变。在极少数情况下,您实际上希望重新分配变量,但如果您这样做,请使用 let 关键字,因为这样您至少具有块级作用域。

其次,在中途你有四个变量定义不正确,根本没有任何关键字。如下定义变量不是正确的 JavaScript 语法:

// wrong! this is correct in Python but not JS

varName = <value>;

您需要使用letconstvar 之一。推荐const

重新编写您的代码以使用正确的变量定义,看看您是否可以以一种不会为奖励积分重新分配变量的方式编写代码。您应该然后发现您的代码不会产生意外的结果。

祝你好运

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    相关资源
    最近更新 更多