繁体   English   中英

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

[英]I am unable to save data to my mongodb Atlas database

Github 仓库。 我正在尝试将 MongoDB Atlas 数据库与我的节点 JS 登录和注册应用程序一起使用来存储数据。 问题是数据没有保存到数据库中,换句话说,即使我的应用程序连接到 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 上找到 注意:我在本地主机上运行这个应用程序。

让我们逐步执行代码,看看会发生什么:

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

到MongoDB的连接被创建,然后somewhen连接建立或者失败,则回调函数被调用了。 现在创建一个保存数据库引用的局部变量

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

然后关闭连接:

 client.close();

然后回调结束:

 });

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

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

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

由于各种原因,这不起作用:

1)数据库甚至可能没有打开

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

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

现在要解决这个问题,我们必须:

1)只有在db连接建立时才启动webserver

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. 连接到 MongoDB
  2. 创建对集合的引用
  3. 关闭连接
  4. 当有人尝试访问/register路由时,此时您已经关闭了连接。 因此,任何对数据库的操作尝试都会以连接错误告终。

文档中建议调用MongoClient.connect一次MongoClient.connect用回调返回的数据库变量,即不要手动关闭连接,驱动程序只会创建和使用连接池,所以不要担心关闭连接。 查看文档中的示例代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM