Node.js 如何根据一些数据库搜索返回json?
我试图创建一个注册脚本,检查提交的信息是否已经在数据库中 这是它的路线Node.js 如何根据一些数据库搜索返回json?,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我试图创建一个注册脚本,检查提交的信息是否已经在数据库中 这是它的路线 router.post('/', (req, res) => { let { username, email, password, confirm_password } = req.body; console.log(req.body); if (password !== confirm_password) { res.status(400).json({msg: "Passwo
router.post('/', (req, res) => {
let {
username,
email,
password,
confirm_password
} = req.body;
console.log(req.body);
if (password !== confirm_password) {
res.status(400).json({msg: "Password does not match."});
return;
}
User.findOne({username: username})
.then(user => {
console.log(user)
if (user) {
res.json({msg: "Username is already taken."})
return;
}
}).catch(err => {console.log(err)});
User.findOne({email: email})
.then(user => {
if (user) {
res.json({
msg: "Email is already taken."
})
}
});
let newUser = new User({
username,
password,
email
});
console.log("about to start hash")
return bcrypt.genSalt(10, (err, salt) => {
if (!err) {
bcrypt.hash(newUser.password, salt, (err, hash) => {
if (err) consoloe.log("**********************\n" ,err,"**********************\n");
newUser.password = hash;
console.log("before save")
newUser.save().then(user => {
console.log("all good")
res.json({
msg:"good"
});
});
})
}
})
我只是复制了“片段”,如果你注意到未关闭的东西,这就是原因
我尝试添加那些返回语句,但没有效果,我认为这是因为它是异步运行的,所以它同时做这两件事是没有意义的(请给我解释一下,因为我根本不懂)
它显示的错误是
发送到客户端后无法设置标头
我想做什么来检查用户名和电子邮件是否不存在,在这种情况下,将它们添加到数据库中,并使用哈希传递(这是可行的,但忽略了其他条件,因此即使是这样,它们也会再次添加)
我现在得到的回应是
{
“msg”:“用户名已被占用。”
}
我认为我的问题是,我根本不理解“线程”是如何工作的。正如你在问题中提到的,findOne和
都将异步运行。您也收到消息的原因是在发送到客户端后无法设置头
,因为您在findOne
两种方法中都有res.json
,一旦承诺得到解决,两种方法都将尝试发送响应
您可以通过使用async/await
简单地解决这个问题,您可以使用$或操作符执行单个查询,而不是两个单独的查询
router.post('/',异步(req,res)=>{
const user=wait user.findOne({$or:[{
电邮:电邮
}, {
用户名:username
}]});
如果(用户){
如果(user.username==用户名){
res.json({msg:“用户名已被占用。”})
回来
}否则{
res.json({msg:“电子邮件已被接收。”})
回来
}
}
}