Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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
Node.js 如何根据一些数据库搜索返回json?_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

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:“电子邮件已被接收。”})
回来
}
}   
}