簡體   English   中英

在MongoDB find函數中,我回調並使用res.redirect,我得到一個無法設置的頭錯誤?

[英]Inside a MongoDB find function, I callback and use a res.redirect, I get a cannot set header error?

我正在嘗試在數據庫(mongoDB)中搜索用戶/商店帳戶,然后刷新登錄頁面但出現一些錯誤,或者將其發送到所需的頁面。

到目前為止,將它們發送到所需的頁面尚可,但是,當嘗試重新定向到/ signin頁面時,我從Node控制台收到此錯誤消息。

throw err;
      ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

這是實際的代碼

//Rendering Signin Page
app.get('/signin', function(req, res) {
    res.render('signin', {
        err: false,
    })
});

//Rendering Signin Page with err
app.get('/signin/err', function(req, res) {
    res.render('signin',{
        err: true,
    })
});


app.post('/signin', function(req, res) {
    let data  = req.body;
    User.find({email: data.email},'_id email password', function(err, docs) {
        if(err) {
            console.log(err);
        }
        else {


            //Finding the matching user
            for(i = 0; i < docs.length; i++) {
                if(data.password == docs[i].password) {
                    res.redirect('/'+docs[i]._id + '/userhome')
                }
            }

            if(docs.length === 0) {
                console.log('no user found')
                res.redirect('/signin/err');
                return;
            }
        }
    })
    Shop.find({email: data.email}, '_id email password', function(err,docs) {
        if(err) {
            console.log(err);
        }
        else {

            //Finding the matching user
            for(i = 0; i < docs.length; i++) {
                if(data.password == docs[i].password) {
                    res.redirect('/'+docs[i]._id + '/shophome')
                }
            }

            if(docs.length === 0) {
                console.log('no shop found')
                res.redirect('/signin/err')
                break;
            }
        }
    })
})

這也是我要渲染的Pug文件(我不認為這是問題所在)

doctype html
html
    head    
        title uShop
        //Bootstrap CSS
        link(rel="stylesheet", href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous")
        script(src='https://code.jquery.com/jquery-3.3.1.slim.min.js', integrity='sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo', crossorigin='anonymous')
        script(src='https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js', integrity='sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1', crossorigin='anonymous')
        script(src='https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js', integrity='sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM', crossorigin='anonymous')
    body
        nav(class="navbar navbar-expand-md navbar-dark bg-dark sticky-top") 
            a(class="navbar-text" style="font-size:175%; color:white; padding:0px" href="/") uShop.com
        h1(class="display-2 text-center position-relative" style="top: 3rem; font-size: 400%") Sign In
        form(action="/signin" method="POST")
            div(class="form-row position-relative" style="top:7rem")
                label(class="col-lg-4 col-form-label position-relative text-right" for="inputEmail" style="font-size: 150%; top:-5px; left: -5px;") Email:
                input(class="form-control col-lg-4" type="email" name="email" id="inputEmail")
            //- if err == true
            //-     div(class="invalid-feedback") email incorrect
            br
            div(class="form-row position-relative" style="top:7rem")
                label(class="col-lg-4 col-form-label position-relative text-right" for="inputPassword" style="font-size: 150%; top:-5px; left: -5px;") Password:
                input(class="form-control col-lg-4" type="password" name="password" id="inputPassword")
            div(class="form-row position-relative" style="top:8rem")
                input(class="btn btn-primary btn-lg offset-lg-4 " type="submit" value="Sign In")
app.post('/signin', function (req, res) {
    let data = req.body;
    User.find({ email: data.email }, '_id email password', function (err, docs) {
        res.redirect('/' + ...);
    })
    Shop.find({ email: data.email }, '_id email password', function (err, docs) {
        res.redirect('/' + ...);
    });
})

res.redirect不能在每個請求中運行兩次,但是,由於您的原因,至少調用了兩次


這個怎么樣?

app.post('/signin', function (req, res) {

  let data = req.body;
    User.find({ email: data.email }, '_id email password', function (err, docs) {
        // res.redirect('/' + ...);

        Shop.find({ email: data.email }, '_id email password', function (err, docs) {
            res.redirect('/' + ...);
        });
    });
})

另外,???

您需要重定向到
'/' + docs[i]._id + '/shophome'

'/' + docs[0]._id + '/userhome' (一個請求)中signin API中的'/' + docs[0]._id + '/userhome'

我認為,這對於http(rest api)請求是不可能的,並且nodejs和其他語言是相同的。

另外,我認為這是normal user目的。

您想在usershop集合中進行搜索。

  1. 添加async/await它將使您的代碼更具可讀性
app.post('/signin', async function(req, res) {
....
})
  1. 您需要將findOne用於集合搜索,並且在搜索參數中都使用emailpassword ,因此無需在代碼中進行進一步的密碼檢查
const userResult = await User.findOne({ email: data.email, password: data.password }, '_id email password');
const shopResult = await Shop.findOne({ email: data.email, password: data.password }, '_id email password');

  1. 結果,如果emailpassword匹配,則findOne返回object 您可以檢查兩個結果是否均為空,然后按以下方式重定向
if(!userResult && !shopResult) {
  return res.redirect('/signin/err');
}

if(userResult) {
  return res.redirect('/'+userResult._id + '/userhome')
}

if(shopResult) {
  return res.redirect('/'+shopResult._id + '/shophome')
}

增加return上達到redirect將確保代碼執行已在該點結束。

使用try/catch記錄不需要的錯誤。

async/await MND鏈接: https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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