我无法理解如何为Express应用创建以(err, result)
格式返回的函数。
我当前的数据库查询功能是:
pool.query(
'SELECT id FROM users WHERE email = ? LIMIT 1',
[email],
(results) => { // I'd like this to be (err, results)
if(results instanceof Error){...}
}
})
在我的db.js文件中,池看起来像这样:
module.exports = {
query: (query, args, cb) => {
pool.getConnection( (err, connection) => {
if(err){
new Error('No database connections available in pool')
} else {
connection.query(query, args, (error, results, fields) => {
connection.release()
// I got a MySQL error here and I'd like to handle it in my callback function
if(error){
new Error('Bad query')
} else {
cb(results)
}
})
}
})
}
}
对于此功能和其他功能,我希望返回正确的Error
(如果有),并让我的回调听取err, result
作为参数。
我尝试使用new Error('Bad query')
,但无论如何,这都是我的回调中的第一个变量(这是我最终使用instanceof Error
的方式。
如何构建回调和响应,以便您的回调可以采用err, result
格式,并在您正在创建的功能上正确检查/处理错误? (我理解如何将它用于已经采用这种格式的模块 - 我正在谈论编写/格式化你自己的代码。)
谢谢!
答案 0 :(得分:1)
你可以这样做:
module.exports = {
query: (query, args, cb) => {
pool.getConnection( (err, connection) => {
if(err){
cb(new Error('No database connections available in pool'));
} else {
connection.query(query, args, (error, results, fields) => {
connection.release();
// I got a MySQL error here and I'd like to handle it in my callback function
if(error){
cb(new Error('Bad query'));
} else {
cb(null, results);
}
});
}
});
}
}
您始终将错误值作为回调的第一个参数传递,如果有结果,则将其作为第二个传递。然后,在回调中,检查err
是否为非空,如果是,则表示存在错误。如果它是null
,则第二个参数包含结果。
请注意,如果不返回或包含数据库为您提供的实际err
值,您可能会隐藏有用的信息(例如查询失败的原因)。
然后,在你使用它的地方,你会做这样的事情:
let query = 'SELECT id FROM users WHERE email = ? LIMIT 1';
pool.query(query, [email], (err, result) => {
if (err) {
// handle error here
} else {
// process result here
}
});