簡體   English   中英

res.send() 不適用於兩個不同的回調

[英]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 });
});

我可以看到您的代碼存在多個問題:

  1. 它實際上正在工作,但它在邏輯上不正確,立即返回您的空errorsuccess變量,而無需等待您的查詢完成。
  2. 您與error變量有一些沖突,請考慮重命名為與您的外部聲明不重疊的內容。 雖然它確實有效,但它給了你混亂的空間。
  3. 您的if條件和邏輯運算符不正確。

這是一個快速修復,但不考慮這可以更清潔。 還有一些快速提示:

  1. 如果可能,請盡早返回/終止。
  2. 避免很長的行以使您的代碼更易於閱讀
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM