【问题标题】:UnhandledPromiseRejectionWarning: Unhandled promise rejection NodeJS MSSQLUnhandledPromiseRejectionWarning:未处理的承诺拒绝 NodeJS MSSQL
【发布时间】:2017-05-07 07:52:27
【问题描述】:

我正在测试一些设置 API 的 NodeJS。

但是,当 SQL 返回有关 NULL 列的错误时,我的 http 调用就会挂起,您可以在节点控制台中看到该错误。

我得到的错误是

node:7397) UnhandledPromiseRejectionWarning: 未处理的承诺 拒绝(拒绝 id:2):RequestError:无法插入值 NULL 到列'FeatureEntryId',表'testdb STING.dbo.J_ProductFeaturesRelation';列不允许空值。 插入失败。”

了解 SQL 错误,这很好,我只是希望 NodeJS 将此错误消息返回给客户端。

这是代码。

//Add or update feature relations
var insertFeatureRelation = (callback, productid, featureid) => {
    console.log(productid + ' ' + featureid)
    var conn = new sql.Connection(settings.dbConfig())
    conn.connect().then(function (conn) {
        var request = new sql.Request(conn);
        request.input('productid', sql.VarChar, productid);
        request.input('featureid', sql.VarChar, featureid);
        request.execute('PM_InsertFeatureRelation').then(function (recordsets, returnValue, affected) {
            callback(recordsets)
        })
    }).catch(function (err) {
        console.log('ffs');
        callback(null, err);
    });
}
exports.insertFeatureRelation = function (req, resp, productid, featureid) {
    insertFeatureRelation(function (data, err) {
        if (err) {
            httpMsgs.show500(req, resp, err)
        } else {
            httpMsgs.sendJSON(req, resp, data)
        }
        resp.end();
    }, productid, featureid)
};

如果存储过程运行良好,则代码可以正常工作,但错误实际上永远不会传递到页面。

这里是httpMsgs的内容:

exports.show500 = function(req, resp, err) {
    console.log('heree')
        resp.writeHeader(500, {"Content-Type": "application/json"});
        resp.write(JSON.stringify({data: "Error:" + err}))
};

exports.sendJSON = function(req, resp, data) {
    if (data){
        resp.writeHeader(200, {"Content-Type": "application/json"});
        resp.write(JSON.stringify(data));
    }
}

【问题讨论】:

  • 你有什么问题?
  • @MrJLP 如果 SQL 返回错误,为什么 httpMsgs.show500(req, resp, err) 不会触发。我原以为它会在 catch 中捕获错误,然后运行 ​​console.log('ffs') 和回调。
  • 失败的承诺是request.execute('PM_InsertFeatureRelation'),您对此没有把握。
  • @naortor - 非常感谢!我现在明白多了。上面代码中的 catch 只会在无法连接到 SQL 时触发,所以我在 request.execute 承诺中添加了一个 catch。

标签: javascript sql-server node.js express promise


【解决方案1】:

供以后参考...节点挂起的原因是因为SQL的错误从未被execute函数的catch捕获。

这是更新后的代码。

//Add or update feature relations
var insertFeatureRelation = (callback, productid, featureid) => {
    console.log(productid + ' ' + featureid)
    var conn = new sql.Connection(settings.dbConfig())
    conn.connect().then(function (conn) {
        var request = new sql.Request(conn);
        request.input('productid', sql.VarChar, productid);
        request.input('featureid', sql.VarChar, featureid);
        request.execute('PM_InsertFeatureRelation').then(function (recordsets, returnValue, affected) {
            callback(recordsets)
        }).catch(function (err) {
            console.log(err);
            callback(null, err);
        })
    }).catch(function (err) {
        console.log(err);
        callback(null, err);
    });
}
exports.insertFeatureRelation = function (req, resp, productid, featureid) {
    insertFeatureRelation(function (data, err) {
        if (err) {
            httpMsgs.show500(req, resp, err)
        } else {
            httpMsgs.sendJSON(req, resp, data)
        }
        resp.end();
    }, productid, featureid)
};

【讨论】:

    【解决方案2】:

    虽然@Adam91Holt 的回答还可以,但可以进一步简化为

    var insertFeatureRelation = (callback, productid, featureid) => {
        console.log(productid + ' ' + featureid)
        var conn = new sql.Connection(settings.dbConfig())
        conn.connect().then(function (conn) {
            var request = new sql.Request(conn);
            request.input('productid', sql.VarChar, productid);
            request.input('featureid', sql.VarChar, featureid);
            return request.execute('PM_InsertFeatureRelation');
        }).then(function (recordsets) {
            callback(recordsets);
        }).catch(function (err) {
            console.log(err);
            callback(null, err);
        });
    }
    

    好处是有单点错误处理

    老实说,我不会使用带有 promise 的回调范例,除非我必须这样做

    var insertFeatureRelation = (productid, featureid) => {
        console.log(productid + ' ' + featureid)
        var conn = new sql.Connection(settings.dbConfig())
        conn.connect().then(function (conn) {
            var request = new sql.Request(conn);
            request.input('productid', sql.VarChar, productid);
            request.input('featureid', sql.VarChar, featureid);
            return request.execute('PM_InsertFeatureRelation');
        });
    }
    exports.insertFeatureRelation = function (req, resp, productid, featureid) {
        insertFeatureRelation(productid, featureid).then(function(data) {
            httpMsgs.sendJSON(req, resp, data)
            resp.end();
        }).catch(function (err) {
            httpMsgs.show500(req, resp, err)
            resp.end();
        });
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多