【问题标题】:Node MySQL hanging节点 MySQL 挂起
【发布时间】:2021-01-25 01:47:21
【问题描述】:

我有我的 GET 端点,它只是一个简单的 SELECT * FROM tableName 并返回表中的所有行,但它一直挂起。当我在本地用 POSTMAN 打它时,它一直在旋转

发送请求...并且程序永远不会出错。 get 端点在 connection.query(...) 之后挂起,第四个 console.log("HIT) 没有打印

router.get('/allRows', async (req, res) => {
    console.log("HIT")
    if (req.query.tableName) {
        console.log("HIT")
        connection.connect((err) => {
            if (err) console.log(err);
            console.log("HIT")
            connection.query(`SELECT * FROM ${req.query.tableName};`), (err, result, fields) => {
                console.log("HIT")
                if (err) console.log(err);
                console.log(result)
                res.status(200).json({
                    message: `Successfully got all data from ${req.query.tableName}`,
                    result: result
                });
            };
            connection.end((err) => {
                if (err)
                    console.error("Error when closing connection", err)
            });
        })
    }
    else {
        res.status(400).json({
            message: `Please provide table name`,
        });
        console.log('Missing table name');
    }
});

我目前有 3 个“HIT”日志,有什么想法吗?

我注意到,如果我在邮递员中取消无休止的请求并再次点击端点,我会收到 PROTOCOL_ENQUEUE_AFTER_QUIT 错误

编辑

我将代码更改为:

    router.get('/allRows', async (req, res) => {
    console.log("HIT")
    // also another guard for table name inside an array is needed
    if (req.query.tableName) {
            console.log("HIT")
            connection.connect();
            connection.query(`SELECT * FROM ${req.query.tableName}`), (err, rows, fields) => {
                console.log("HIT", rows)
                if (err) console.log(err);
                res.status(200).json({
                    message: `Successfully got all data from ${req.query.tableName} LIMIT 1`,
                    result: rows
                });
                console.log("result")
            };
    }
    else {
        res.status(400).json({
            message: `Please provide table name`,
        });
        console.log('Missing table name');
    }
});

仍然遇到同样的问题,并且只有 2 次控制台点击...我已经运行了调试器,当它到达 connection.query 时,它只是跳过它并且不进入箭头函数。

debugger at connection.query

debugger after connection.query

【问题讨论】:

  • 旁注:让表名作为外部查询参数是非常糟糕的做法。
  • 谢谢,也许我可以用 mysql.escape() 转义它?它是一个仅供我使用的私有 API - 你认为这样可以吗,或者你能提出更好的建议吗? @TimBiegeleisen
  • 对有效表名使用白名单
  • 我认为问题出在 connection.connect 上,有任何文档吗?
  • 我正在使用这个 NPM 模块npmjs.com/package/mysql

标签: mysql node.js get mysqlconnection


【解决方案1】:

根据模块文档,connection.connect 将构建到数据库的实时链接。

只在服务器启动时调用它,并在服务器关闭时停止它。

当你想解决请求时调用 connection.query。

connection.connect()

router.get(
   .....

  connection.query()
)

server.on(‘close’, ()=> connection.close()) // I guess

连接错误:

connection.connect(function(err) {
  console.log(err.code); // 'ECONNREFUSED'
  console.log(err.fatal); // true
});
router.get(
   .....

  connection.query()
)

server.on(‘close’, ()=> connection.close()) // I guess

【讨论】:

  • 你收到了什么消息?
  • 你看到我在哪里调用 connect() 了吗?外面
猜你喜欢
  • 2012-03-19
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2020-07-12
相关资源
最近更新 更多