我正在尝试正确处理下面的node.js函数的错误/异常,而不影响其(a)同步执行。
具体来说,我想确保在开始根据sql语句创建新数据之前,已完全清除数据库(“ removeCustomer”)。
问题:我需要通过helper.returnAPISuccess(“成功插入的行”,对,回调)在某处解决承诺...
但是,如果我将 .then()链接到 pairs.map()函数,则会干扰整体同步性,例如仅返回第一行,而不是.map创建的每个结果。
也许我可以尝试Promise.all()?我想我需要将所有“对”添加到承诺数组,全部解决,然后 .then(helper.returnAPISuccess ... 等?还是我应该尝试弄平嵌套的诺言...?
updateCustomer函数:
updateCustomer(email, body, callback) {
// Delete old data before creating new data for the customer
helper.removeCustomer(this.db, email, callback)
.then(() => {
// Query to find category/item pairs
let sql =`SELECT key as category, json_array_elements_text(value::json) as item
FROM json_each_text($1:csv)`;
this.db.queries.any(sql, [body])
.then(pairs => {
const insert =`INSERT INTO purchases_table(item, category, email_address)
VALUES($1, $2, $3)`;
// Map each pair to the customer's email and insert into the purchases table
pairs.map(pair => {
this.db.queries.none(insert, [pair['item'], pair['category'], email])
.catch(error => {
helper.returnAPIError(error, 'Error inserting customer data', callback);
});
})
})
.catch(error => {
helper.returnAPIError(error, 'Error retrieving category/item pairs', callback);
});
})
.catch(error => {
helper.returnAPIError(error, 'Error removing old customer data', callback);
});
}
任何帮助将不胜感激,谢谢:)
删除收件人:
module.exports.removeRecipient = (db, email) => {
let sql = `DELETE FROM purchases_table WHERE email_address=$1`;
return db.queries.result(sql, [email]);
}
returnAPISuccess:
module.exports.returnAPISuccess = (msg, data, callback) => {
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": true,
"Content-Type": "application/json",
},
body: JSON.stringify({ message: msg, data: data })
};
callback(null, response);
}
答案 0 :(得分:0)
也许我可以尝试Promise.all()?我认为我需要将所有“成对”添加到一个promise数组中,全部解决它们,然后.then(helper.returnAPISuccess ...等。
是的,这很完美。
还是我应该使嵌套的诺言扁平化??
您也应该这样做。也许更重要的是,最好不要完全调用任何callback
参数,而是从updateCustomer
返回一个承诺。