【发布时间】:2020-02-26 05:53:40
【问题描述】:
我正在重构我的代码以使用 Promises 删除“回调地狱”,但遇到了一个我无法通过的错误。我的代码接收 ID 列表并处理它们进行很少的数据库调用,这就是我有这个“回调地狱”的原因。
在 Promise 之前一切正常。当我必须回复客户端时,res 等于 0。
function processVMDelete(returnedVMIDs){
return new Promise((resolve, reject) => {
var mariasqlClient = dbConnection();
mariasqlClient.query( sqlUpdateDELETE_STATE_ByVMID, [
'DELETE',
returnedVMIDs
], function(err, rows) {
if (err){
reject(err);
}
console.log('finish update');
// dont' need to return anything here
resolve(0);
});
mariasqlClient.end();
});
}
function getListExpVM(){
return new Promise((resolve, reject) => {
var vmList = [];
var mariasqlClient = dbConnection();
mariasqlClient.query( sqlSearch_ByUSERNAMEAndSTATE, [
requesterUsername,
'ACTIVE'
], function(err, rows) {
if (err){
reject(err);
}
vmList = filterExpiredVMs(rows);
var response = {
status : 200,
success : 'Successfull',
data : vmList,
requester: requesterUsername
};
resolve(response);
});
mariasqlClient.end();
});
}
router.post('/processVMs', function(req, res) {
var returnedVMIDs = JSON.parse(req.body.data);
processVMDelete(returnedVMIDs)
.then(res => {
console.log('done');
// check if there is more available for the user:
getListExpVM()
.then(response => {
console.log('sending back list of VMs');
//===>>> ERROR HERE: res.end is not a function
res.end(JSON.stringify(response));
})
.catch(err => {
console.log('error', err.message);
logger.error("Error getting expired VMs: " + err.message);
//===>>> ERROR HERE: res.send is not a function
res.status(500).send({error: err.message})
});
})
.catch(err => {
console.log('error', err.message);
logger.error("Error processing VMs: " + err.message);
//===>>> ERROR HERE: res.send is not a function
res.status(500).send({error: err.message})
});
});
【问题讨论】:
-
这是因为
processVMDelete(returnedVMIDs).then(res => {...})- 无论processVMDelete返回什么,您都在尝试调用.end和.status方法。将其重命名为其他名称,以便它使用来自router.post("/processVMs", function(req, res) {..})的原始res -
另外,你在
Promises的情况下仍然遇到类似回调地狱的情况,你有什么版本的Node.js可用?也许你可以在这里使用async/await让它变得更简单。