繁体   English   中英

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

[英]why does this mysql error causes nodejs to crash instead of going to the catch function?

我有一个创建的条目的MySQL的声明,它有一个.then功能和.catch功能,但是当出现以下错误:

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

服务器崩溃而不是像.catch函数中定义的那样回答 500

注意:我正在使用 npm 中的mysql2库和承诺( 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")
}

mysqlConnectionPool.execute创建承诺之前抛出异常。

即异常不是从承诺中抛出的。

要捕获它,您需要围绕对mysqlConnectionPool.execute的调用try {} catch (e) {}

实际上,@Quentine 接近正确的事情......

这是mysql2 “某种”错误,我使用某种错误,因为https://github.com/sidorares/node-mysql2/issues/902表明mysql2的开发团队可以接受它。

这是 mysql2.pool 将调用传递给创建的连接的方式的问题,它没有将异常传递给包装承诺。

我最终制作了我自己的包装函数来创建连接 + 调用 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);                
            });
        });
    }

好,

我猜你正在使用标准的mysql包,它似乎不支持 Promises,相反,它接受一个标准的节点回调function(err, results, fields) {}作为 execute 方法的参数。

因此,由于您尚未定义有效的回调,脚本只会抛出异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM