[英]res.send() not working for two different callbacks
我無法讓res.send()
為所有回調工作,我的一個想法是移動return res.send({ error, success });
到放置在上面的回調,但它不會在下面執行潛在的錯誤/成功消息。
我嘗試了一種不同的方式,我使用了 function 之類的createUser()
,它使用回調返回錯誤/成功消息,但也無法讓它工作。 有什么可以指出我如何使這項工作正常工作嗎?
一位朋友建議使用 await 和 async 回調,但在搜索它時,我不太熟悉,無法理解它是如何正常工作的。
app.post('/create', function(req, res) {
// -- Default Variables
let error = "";
let success = "";
let formData = req.body.formData;
if (formData.userName, formData.userPass, formData.userEmail) {
console.log(formData);
conn.query("SELECT COUNT(userId) AS rowCount FROM users WHERE userName = ?", [formData.userName], function(error, results, fields) {
if (results[0].rowCount == 0) {
conn.query("INSERT INTO users ( userName, userEmail, userPass ) VALUES ( ?, ?, ? )", [ formData.userName, formData.userEmail, formData.userPass ], function(error, results, fields) {
if (results.affectedRows >= 1)
success = "Your account has successfully been created!";
else
error = "Unexpected error occured, please try again!";
});
} else { error = "You already have an account!"; }
});
} else {
error = "Please make sure all fields are entered correctly!";
}
// -- Return
return res.send({ error, success });
});
我可以看到您的代碼存在多個問題:
error
和success
變量,而無需等待您的查詢完成。error
變量有一些沖突,請考慮重命名為與您的外部聲明不重疊的內容。 雖然它確實有效,但它給了你混亂的空間。if
條件和邏輯運算符不正確。這是一個快速修復,但不考慮這可以更清潔。 還有一些快速提示:
app.post('/create', function(req, res) {
// -- Default Variables
let error = "";
let success = "";
const formData = req.body.formData;
const {
username,
userPass,
userEmail
} = formData;
// Avoid too much nested code, terminate/Return early if possible.
if (!userName || !userPass || !userEmail) {
error = "Please make sure all fields are entered correctly!";
return res.send({ error, success });
}
conn.query("SELECT COUNT(userId) AS rowCount FROM users WHERE userName = ?", [userName], function(error, results, fields) {
if (results[0].rowCount == 0) {
const parameters = [ userName, userEmail, userPass ];
// Avoid very long lines. It becomes harder to read (TIP: Consider using lint)
conn.query("INSERT INTO users ( userName, userEmail, userPass ) VALUES ( ?, ?, ? )", parameters , function(error, results, fields) {
if (results.affectedRows >= 1) {
success = "Your account has successfully been created!";
} else {
error = "Unexpected error occurred, please try again!";
}
res.send({ error, success }); return;
});
} else {
error = "You already have an account!";
res.send({ error, success }); return;
}
});
});
conn.query
調用異步回調並return res.send({ error, success });
立即返回。 異步回調中更改的值位於閉包中,僅在return res.send({ error, success });
之后執行已經返回值。 所以唯一可能出現的錯誤是else
分支中唯一的錯誤。
嘗試用 promise 重寫它:
app.post('/create', function x(req, res) {
return new Promise(function(resolve, reject){
let error = "";
let success = "";
let formData = req.body.formData;
if (formData.userName && formData.userPass && formData.userEmail) {
console.log(formData);
conn.query("SELECT COUNT(userId) AS rowCount FROM users WHERE userName = ?", [formData.userName], function(error, results, fields) {
if (results[0].rowCount == 0) {
conn.query("INSERT INTO users ( userName, userEmail, userPass ) VALUES ( ?, ?, ? )", [ formData.userName, formData.userEmail, formData.userPass ], function(error, results, fields) {
if (results.affectedRows >= 1)
success = "Your account has successfully been created!";
else
error = "Unexpected error occured, please try again!";
resolve({ error, success });
});
} else {
error = "You already have an account!";
resolve({ error, success }); }
});
}
else{
error = "Please make sure all fields are entered correctly!";
resolve({ error, success });
}
});
});
盡管我知道總是解決並不是使用 Promises 的干凈方式。 您應該考慮更改您的 API 向客戶端返回正確的錯誤,並帶有適當的 HTTP 錯誤代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.