代码之家  ›  专栏  ›  技术社区  ›  Tom Klino

为什么这个mysql错误会导致nodejs崩溃而不是去catch函数?

  •  3
  • Tom Klino  · 技术社区  · 7 年前

    我有一个mysql语句创建一个条目,它有一个 .then 函数和 .catch

    TypeError('Bind parameters must not contain undefined. To pass SQL NULL specify JS null');

    服务器崩溃,而不是响应中定义的500 .接住 功能

    mysql2 npm的图书馆承诺( require('mysql2/promise'); )

    req.params.account_name undefined ):

    const CREATE_ACCOUNT_STATEMENT =
      'INSERT INTO `Accounts` (`account_token`, `account_name`) VALUES (?, ?)'
    
    try {
      mysqlConnectionPool.execute(CREATE_ACCOUNT_STATEMENT, [
        account_token, account_name
      ])
      .then(() => {
        res.end(JSON.stringify({ token: account_token }))
      })
      .catch((e) => {
        debug(1, "error while trying to create account:", e)
        res.status(500).end("Internal Server Error")
      })
    } catch(e) {
      debug(1, "error while trying to create account:", e)
      res.status(500).end("Internal Server Error")
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Tomer W    5 年前

    事实上,@Quentine很接近正确的事情。。。

    这是一个“有点”的错误 mysql2 我用它是因为 https://github.com/sidorares/node-mysql2/issues/902 建议开发团队 没问题。

    最后,我创建了自己的包装函数,用适当的promise处理来创建connection+call execute。

    import mysql = require('mysql2');
    private async queryDB(query:string, useExecute: boolean = false, ...args:any[]) : Promise<any[]>
        {
            return new Promise<any[]>((resolve, reject)=>{
                for(var i = 0; i < args.length; ++i)
                {
                    if(args[i]===undefined)
                        args[i] = null;
                }
                this.dbPool.getConnection((err, conn)=>{
                    if(err){
                        reject(err);
                        return;
                    }
                    
                    let cb = function(err: mysql.QueryError, results: any[], fields: mysql.FieldPacket[]) {
                        conn.release();
                        if(err)
                        {
                            reject(err);
                            return;
                        }
                        resolve(results);
                    }
                    if(useExecute)
                        conn.execute(query, args, cb);
                    else
                        conn.query(query, args, cb);                
                });
            });
        }
    
        2
  •  1
  •   Quentin    7 年前

    mysqlConnectionPool.execute 正在引发异常 做出承诺。

    为了抓住它你需要 try {} catch (e) {} 在呼叫周围 mysqlConnectionPool.execute

        3
  •  0
  •   George Tavantzopoulos    7 年前

    好,

    mysql 它似乎不支持承诺,相反,它接受一个标准的节点回调 function(err, results, fields) {} 作为execute方法的参数。

    推荐文章