Javascript 在MongoDB find函数中,我回调并使用res.redirect,我得到一个无法设置头错误?
我试图在我的数据库(mongoDB)中搜索用户/商店帐户,然后刷新登录页面,但出现一些错误,或者将它们发送到所需页面 到目前为止,将它们发送到它们所需的页面是可行的,但是当我尝试res.redirect到/signin页面时,我从节点控制台收到了这个错误消息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
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
,因此无需在代码中进一步检查密码
AsfindOne
返回对象
,如果电子邮件
和密码
匹配,则返回结果。
您可以检查是否两个结果都为空,然后按如下所示重定向
在reachredirect
上添加return
将确保代码执行在该点结束
使用try/catch
记录不需要的错误
用于async/await
:的MND链接,您可以在user
或shop
集合中搜索
添加async/await
将使代码更具可读性
您需要使用findOne
进行集合搜索,并在搜索参数中同时使用email
和password
,因此无需在代码中进一步检查密码
AsfindOne
返回对象
,如果电子邮件
和密码
匹配,则返回结果。
您可以检查是否两个结果都为空,然后按如下所示重定向
在reachredirect
上添加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')
}