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

时间:2018-10-23 12:45:36

标签: javascript mysql node.js

我有一个创建条目的mysql语句,它具有一个path()函数和一个.then函数,但是当发生以下错误时:

.catch

服务器崩溃,而不是回答TypeError('Bind parameters must not contain undefined. To pass SQL NULL specify JS null');函数中定义的500

注意:我正在使用带有承诺(.catch)的npm中的mysql2

这是调用它的代码(require('mysql2/promise');req.params.account_name):

undefined

3 个答案:

答案 0 :(得分:1)

mysqlConnectionPool.execute在创建承诺之前 引发异常。

即不会从诺言中抛出异常。

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

答案 1 :(得分:1)

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

这是mysql2中的一个错误, 我之所以使用sort-of,是因为https://github.com/sidorares/node-mysql2/issues/902表示mysql2的开发团队还可以。

mysql2.pool将调用传递给已创建的连接的方式存在问题,该方式不会将异常传递给包装承诺。

我最终制作了自己的包装函数来创建连接+调用执行,并包装在正确的promise处理中。

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 :(得分:0)

好吧

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

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