[英]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");
}
})
});
});
让我描述一下你的流程,这样你就可以理解错误的地方:)
/register
路由时,此时您已经关闭了连接。 因此,任何对数据库的操作尝试都会以连接错误告终。 从文档中建议调用MongoClient.connect
一次MongoClient.connect
用回调返回的数据库变量,即不要手动关闭连接,驱动程序只会创建和使用连接池,所以不要担心关闭连接。 查看文档中的示例代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.