我无法将数据保存到我的mongodb Atlas数据库

时间:2018-10-02 15:06:18

标签: javascript node.js mongodb

Github repo.我正在尝试将MongoDB Atlas数据库与我的节点JS Login&Signup应用程序一起使用来存储数据。问题在于,即使我的应用程序连接到Atlas,数据也没有保存到数据库,或者换句话说,请求没有通过。完整代码可在www.github.com/tahseen09/login

上找到。

// Connection to mongodb atlas
const uri = "mongodb+srv://tahseen09:<PASSWORD>@cluster0-pirty.mongodb.net/userdb"
MongoClient.connect(uri, function(err, client) {
   if(err) {
        console.log('Error occurred while connecting to MongoDB Atlas...\n',err);
   }
   console.log('Connected to Atlas');
   const collection = client.db("userdb").collection("credentials");
   client.close();
});


//New User Registration

app.post('/register', function(req,res){
    
    var cred= new credential();
    cred.uname=req.body.uname;
    const hash = bcrypt.hashSync(req.body.password, 10);
    cred.password=hash;
    collection.save(function(err,newuser){
        if(err){
            res.status(500).send("Username exists");
        }
        else{
            res.status(200).send("New User Created");
        }
    })
})

重要的代码作为代码段附加,其余代码可在www.github.com/tahseen09/login上找到。 注意:我正在本地主机上运行此应用程序。

2 个答案:

答案 0 :(得分:0)

让我们逐步检查代码,看看会发生什么:

 MongoClient.connect(uri, function(err, client) {

创建到mongodb的连接,然后建立连接或连接失败时,回调将被回调。现在,您创建一个局部变量,其中包含数据库引用:

 const collection = client.db("userdb").collection("credentials");

然后关闭连接:

 client.close();

然后回调结束:

 });

这意味着(connection)中的变量无法再访问并因此被回收。

现在某个时间(甚至可能在建立数据库连接之前发生),有人请求该网页,然后您尝试执行以下操作:

 collection.save(/*...*/);

由于各种原因,该方法不起作用:

1)甚至可能无法打开数据库

2)如果它已经打开,那么它也已经关闭。

3)即使当前处于打开状态,您仍无法访问connection,因为它不在范围内。

现在要解决,我们必须:

1)仅在建立数据库连接时启动Web服务器

2)不要关闭连接

3)公开连接,以便可以在其他地方使用

为此,创建一个建立连接并使用db回调的函数是有意义的:

 function withCredentials(callback) {
   const uri = "mongodb+srv://tahseen09:<PASSWORD>@cluster0-pirty.mongodb.net/userdb"
   MongoClient.connect(uri, function(err, client) {
    if(err) {
      console.log('Error occurred while connecting to MongoDB Atlas...\n',err);
    } else {
      console.log('Connected to Atlas');
     const collection = client.db("userdb").collection("credentials");
     callback(collection);
    }
  });
}

所以现在您可以使用它:

 withCredentials(function(credentials) {
   app.post('/register', function(req,res){    
     const cred = { };
     cred.uname = req.body.uname;
     cred.password = bcrypt.hashSync(req.body.password, 10);
     credentials.insertOne(cred, function(err,newuser){
        if(err){
          res.status(500).send("Username exists");
        } else {
          res.status(200).send("New User Created");
        }
     })
   });
 });

答案 1 :(得分:0)

让我描述一下您的流程,以便您可以了解那里的错误点:)

  1. 连接到MongoDB
  2. 创建对集合的引用
  3. 关闭连接
  4. 当某人尝试访问<div><input tpye="number" id="inputBalance"><label>input Balance</label></div> <div><input type="checkbox" id="inputCheckBalance"><label>input check Balance</label></div> <div><input type="checkbox" id="inputIsActive"><label>input is Active</label></div>路由时,到那时您已经关闭了连接。因此,对数据库的任何操作尝试都将导致连接错误。

建议从documentation调用一次/register并重用回调返回的数据库变量,即不要手动关闭连接,驱动程序只会创建并使用连接池,因此请不要担心关闭连接。在文档中查看示例代码。