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上找到。 注意:我正在本地主机上运行此应用程序。
答案 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)
让我描述一下您的流程,以便您可以了解那里的错误点:)
<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
并重用回调返回的数据库变量,即不要手动关闭连接,驱动程序只会创建并使用连接池,因此请不要担心关闭连接。在文档中查看示例代码。