NodeJS, как отправить ответ во время Promise .then? - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть следующий код:

User.getConfByID(userID)
    .then((item)=>{
        if(item.length == 0){
            res.status(400).json({error:"NO_USER_FOUND"})
        }else{
            if(item[0].token == token){
                if((Math.abs(Date.now() - item[0].conf_iat)) > tokenValid){
                    res.status(401).json({error: "TOKEN_INVALID"})
                }else{
                    return mariaDBTemplates.updateOneRowTemplate("User_confirmation", {confirmed:1}, "user_id", userID)
                }
            }else{
                res.status(401).json({error: "TOKEN_NOT_SAME"})
            }
        }
    })
    .then(()=>{
        res.status(200).json({success: "CONFIRMED"})
    })
    .catch((err)=>{
        res.status(500).json({error: err.message})
    })

Вы видите, что у меня есть различные виды сообщений об ошибках с различными видами кодов состояния.Когда я запускаю этот код, он всегда дает мне следующее предупреждение:

 Error: Can't set headers after they are sent

Я думаю, это потому, что я не "нарушаю" Обещание после отправки правильного ответа ?.Но как я могу решить это?Есть предложения?

Cheerio

1 Ответ

0 голосов
/ 16 ноября 2018

ваша проблема с вашей цепочкой обещаний. в вашем первом .then вы всегда устанавливаете ответ с помощью res, но следующий .then в цепочке пытается установить ответ снова. Обратите внимание, что не возвращать что-либо из обещания - это то же самое, что и return Promise.resolve(undefined);.

вот как бы я это сделал:

User.getConfByID(userID)
    .then((item) => {
        if(item.length == 0)
            return { statusCode: 400, body: { error: "NO_USER_FOUND" } };
        else {
            if(item[0].token == token) {
                if((Math.abs(Date.now() - item[0].conf_iat)) > tokenValid)
                    return { statusCode: 401, body: { error: "TOKEN_INVALID" } };
                else {
                    //not sure what this returns, but it looks like this is 
                    //what you're trying to return the 200 for
                    mariaDBTemplates.updateOneRowTemplate("User_confirmation", { confirmed: 1 }, "user_id", userID);

                    return { statusCode: 200, body: { success: "CONFIRMED" } };
                }
            } else
                return { statusCode: 401, body: { error: "TOKEN_NOT_SAME" } };
        }
    })
    .then((result) => {
        res.status(result.statusCode).json(result.body);
    })
    .catch((err) => {
        res.status(500).json({ error: err.message });
    });

Также обратите внимание, что возврат значения из обещания аналогичен возврату Promise.resolve(value); и будет продолжать цепочку обещаний.

...