我正在使用带有mysql的express来表示我的api。
此代码可以正常工作:
exports.addAuthor = function(req, res, next) { // POST /authors {{{
let sqlquery = '';
let a = checkAuthor(req.body);
if(!a.valid) {
var myerr = new Error(a.msg);
myerr.status = 400;
return next(myerr);
}
//
myPool.getConnection(function(err, connection) {
if (err) { return next(err); }
// check if exists first
sqlquery = 'SELECT COUNT(*) AS nb FROM authors';
sqlquery += ' WHERE name = "' + a.name + '" AND firstname = "' + a.firstname + '";';
connection.query(sqlquery, function(err, rows) {
if (err) {
connection.release();
return next(err);
} else {
if (rows[0].nb > 0) {
connection.release();
let myerr = new Error('This author already exists !');
myerr.status = 400;
return next(myerr);
} else {
sqlquery = 'INSERT INTO authors (name, firstname)';
sqlquery += ' VALUES ("' + a.name + '","' + a.firstname + '")';
connection.query(sqlquery, function(err, rows) {
connection.release();
if (err) { return next(err); }
if (rows.affectedRows) {
res.json({name: a.name, firstname: a.firstname, id: rows.insertId});
}
});
}
}
});
});
}; // }}}
首先,我想重用代码来获取作者的id,如果它存在,那么为此定义一个函数。 其次,我想编写更简单,更清晰的代码,因为我想到了更复杂的代码,以及对数据库的未来情况的多个请求。 (只有12行才能检查作者是否存在!)
我知道它必须处理Mysql查询的异步性质。 我读了很多东西,但我仍然无法编写适当的代码来实现这一点。
感谢指出我正确管理不那么简单的案例。
JPM
我想我已经成功地完成了一些昨天无效的代码! 我不知道它是不是最好的方式 我在某个地方拿了一些代码,但我不记得在哪里(可能在这里) 这是:
const execQuery = (sql, params) => new Promise((resolve, reject) => { // {{{
myPool.getConnection(function(err, connection) {
if (err) {
reject(err);
} else {
connection.query(sql, function(err, rows) {
connection.release();
if (err) {
reject(err);
} else {
resolve(rows);
}
})
}
});
}); // }}}
async function getIDAuthor(a) { // {{{
sqlquery = 'SELECT id FROM authors';
sqlquery += ' WHERE name = "' + a.name + '" AND firstname = "' + a.firstname + '"';
if(a.id) { // case update name of known author
sqlquery += ' AND id <> ' + a.id;
}
try {
rows = await execQuery(sqlquery);
if(rows.length>0) {
return rows[0].id;
} else {
return 0;
}
} catch (error) {
return -1;
}
} // }}}
exports.addAuthor = async function(req, res, next) { // POST /authors {{{
let sqlquery = '';
let a = checkAuthor(req.body); // {{{
if(!a.valid) {
var myerr = new Error(a.msg);
myerr.status = 400;
return next(myerr);
} // }}}
let ide = await getIDAuthor(a);
if(ide>0) {
let myerr = new Error('This author already exists !');
myerr.status = 400;
return next(myerr);
}
sqlquery = 'INSERT INTO authors (name, firstname)';
sqlquery += ' VALUES ("' + a.name + '","' + a.firstname + '")';
try {
rows = await execQuery(sqlquery);
if (rows.affectedRows) {
res.json({name: a.name, firstname: a.firstname, id: rows.insertId});
}
} catch (error) {
return next(error);
}
}; // }}}
我还没有检查所有可能的错误 如果需要,请随时告诉我或纠正我。
答案 0 :(得分:0)
我从https://nemethgergely.com/error-handling-express-async-await/中获取了代码和想法 现在它看起来像这样:
exports.addAuthor = asyncMiddleware(async function(req, res, next) { // POST /authors {{{
let sqlquery = '';
let rows;
//
let a = checkAuthor(req.body);
if(!a.valid) { throw boom.badRequest(a.msg); }
let ide = await getIDAuthor(a);
if(ide>0) { throw boom.badRequest('Cet auteur existe déjà !'); }
//
sqlquery = 'INSERT INTO authors (name, firstname)';
sqlquery += ' VALUES ("' + a.name + '","' + a.firstname + '")';
rows = await execQuery(sqlquery);
if (rows.affectedRows) {
res.json({name: a.name, firstname: a.firstname, id: rows.insertId});
}
}); // }}}
实际上这并不能处理所有错误情况。算了吧。仍处于起点。 Grrrrrr。