我试图在循环中运行 MySQL DELETE 命令,试图删除多个项目。下面是我用 Node.js 编写的 AWS Lambda 代码。
const mysql = require('mysql2');
const errorCodes = require('source/error-codes');
const PropertiesReader = require('properties-reader');
const prop = PropertiesReader('properties.properties');
const con = mysql.createConnection({
host: prop.get('server.host'),
user: prop.get("server.username"),
password: prop.get("server.password"),
port: prop.get("server.port"),
database: prop.get("server.dbname")
});
exports.deleteSellerPortfolioItemImages = async (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
if (event.body == null && event.body == undefined) {
var response = errorCodes.missing_parameters;
callback(null, response)
}
else {
let body = JSON.parse(event.body)
let response="";
//console.log("body", body);
for(let i=0;i<body.length;i++)
{
let idseller_portfolio_item_images = Number(body[i].idseller_portfolio_item_images);
console.log(idseller_portfolio_item_images);
if (isNaN(idseller_portfolio_item_images)) {
response = errorCodes.invalid_parameter;
callback(null, response);
}
else {
// allows for using callbacks as finish/error-handlers
const sql = "DELETE FROM seller_portfolio_item_images WHERE idseller_portfolio_item_images = ? ";
await con.execute(sql, [idseller_portfolio_item_images], function (err, result) {
if (err) {
console.log(err.toString());
if (err.toString().indexOf('cannot be null') >= 0) {
response = errorCodes.not_null_parameters;
callback(null, response);
}
response = errorCodes.internal_server_error;
callback(null, response);
}
else {
response = {
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": JSON.stringify({ status: 1 }),
"isBase64Encoded": false
};
}
});
}
}
//If there is no error, this response will be sent back after the for loop
callback(null, response);
}
};
然而,这只是返回一个空响应,没有记录被删除。
但是如果我删除循环callback(null, response);之后for,记录将被删除。在这种情况下,无论如何都会发回错误,因为没有callback.
我认为这是因为我的代码没有等待 for 循环完成而只是等待callback.
我也试过这个如下。
const mysql = require('mysql2');
const errorCodes = require('source/error-codes');
const PropertiesReader = require('properties-reader');
const prop = PropertiesReader('properties.properties');
const con = mysql.createConnection({
host: prop.get('server.host'),
user: prop.get("server.username"),
password: prop.get("server.password"),
port: prop.get("server.port"),
database: prop.get("server.dbname")
});
exports.deleteSellerPortfolioItemImages = (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
if (event.body == null && event.body == undefined) {
var response = errorCodes.missing_parameters;
callback(null, response)
}
else {
let body = JSON.parse(event.body)
let response="";
body.forEach(async (element, index)=>{
let idseller_portfolio_item_images = Number(element.idseller_portfolio_item_images);
console.log(idseller_portfolio_item_images);
if (isNaN(idseller_portfolio_item_images)) {
response = errorCodes.invalid_parameter;
callback(null, response);
}
else {
// allows for using callbacks as finish/error-handlers
const sql = "DELETE FROM seller_portfolio_item_images WHERE idseller_portfolio_item_images = ? ";
await con.execute(sql, [idseller_portfolio_item_images], function (err, result) {
if (err) {
console.log(err.toString());
if (err.toString().indexOf('cannot be null') >= 0) {
response = errorCodes.not_null_parameters;
callback(null, response);
}
response = errorCodes.internal_server_error;
callback(null, response);
}
else {
response = {
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": JSON.stringify({ status: 1 }),
"isBase64Encoded": false
};
}
});
}
})
callback(null, response);
}
};
这也给出了与上述相同的结果。
为什么我的async电话打不通?