Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在MongoDB find函数中,我回调并使用res.redirect,我得到一个无法设置头错误?_Javascript_Node.js_Mongodb_Express_Pug - Fatal编程技术网

Javascript 在MongoDB find函数中,我回调并使用res.redirect,我得到一个无法设置头错误?

Javascript 在MongoDB find函数中,我回调并使用res.redirect,我得到一个无法设置头错误?,javascript,node.js,mongodb,express,pug,Javascript,Node.js,Mongodb,Express,Pug,我试图在我的数据库(mongoDB)中搜索用户/商店帐户,然后刷新登录页面,但出现一些错误,或者将它们发送到所需页面 到目前为止,将它们发送到它们所需的页面是可行的,但是当我尝试res.redirect到/signin页面时,我从节点控制台收到了这个错误消息 throw err; ^ Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client 这是实际的代码 //Rende

我试图在我的数据库(mongoDB)中搜索用户/商店帐户,然后刷新登录页面,但出现一些错误,或者将它们发送到所需页面

到目前为止,将它们发送到它们所需的页面是可行的,但是当我尝试res.redirect到/signin页面时,我从节点控制台收到了这个错误消息

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;
            }
        }
    })
})
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]。\u id+'/shophome'


'/'+docs[0]。\u id+'/userhome'
登录API
的onece中(一次请求)

我认为,这对于http(RESTAPI)请求是不可能的, 而
nodejs
和其他语言是一样的

另外,我认为这也是
普通用户的目的

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]。\u id+'/shophome'


'/'+docs[0]。\u id+'/userhome'
登录API
的onece中(一次请求)

我认为,这对于http(RESTAPI)请求是不可能的, 而
nodejs
和其他语言是一样的


另外,我认为这是
普通用户

的目的,因为您希望在
用户
商店
集合中搜索

  • 添加
    async/await
    将使代码更具可读性
  • 您需要使用
    findOne
    进行集合搜索,并在搜索参数中同时使用
    email
    password
    ,因此无需在代码中进一步检查密码
  • As
    findOne
    返回
    对象
    ,如果
    电子邮件
    密码
    匹配,则返回结果。 您可以检查是否两个结果都为空,然后按如下所示重定向
  • 在reach
    redirect
    上添加
    return
    将确保代码执行在该点结束

    使用
    try/catch
    记录不需要的错误


    用于
    async/await

    的MND链接,您可以在
    user
    shop
    集合中搜索

  • 添加
    async/await
    将使代码更具可读性
  • 您需要使用
    findOne
    进行集合搜索,并在搜索参数中同时使用
    email
    password
    ,因此无需在代码中进一步检查密码
  • As
    findOne
    返回
    对象
    ,如果
    电子邮件
    密码
    匹配,则返回结果。 您可以检查是否两个结果都为空,然后按如下所示重定向
  • 在reach
    redirect
    上添加
    return
    将确保代码执行在该点结束

    使用
    try/catch
    记录不需要的错误


    异步/等待的MND链接:

    哇!谢谢你的回复。我不太熟悉async/await,但我会看一下文档。哇!谢谢你的回复。我对async/await不太熟悉,但我会看一下文档。
    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('/' + ...);
            });
        });
    })
    
    app.post('/signin', async function(req, res) {
    ....
    })
    
    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');
    
    
    if(!userResult && !shopResult) {
      return res.redirect('/signin/err');
    }
    
    if(userResult) {
      return res.redirect('/'+userResult._id + '/userhome')
    }
    
    if(shopResult) {
      return res.redirect('/'+shopResult._id + '/shophome')
    }