【发布时间】: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