首页 > 解决方案 > 节点 MySQL 挂起

问题描述

我有我的 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 时,它只是跳过它并且不进入箭头功能。

connection.query 处的调试器

connection.query 之后的调试器

标签: mysqlnode.jsgetmysqlconnection

解决方案


根据模块文档,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

推荐阅读