Javascript 为什么我在尝试访问下面代码中的db.collection时会得到一个未定义的值?
//当我尝试在这里调用我的db.collection方法时,我得到一个错误 声明TypeError:无法读取的属性“collection” 未定义 我已经确保全局声明了我的db变量,甚至还通过了 它将连接到check_db函数以确保 下面是完整的错误声明 TypeError:无法读取未定义的属性“collection” 在check_db(/home/ubuntu/workspace/urlshortener/server.js:45:7) 在/home/ubuntu/workspace/urlshortener/server.js:35:8 在/home/ubuntu/workspace/urlshortener/node_modules/googleurl/lib/google.js:18:7 立即。_onImmediate(/home/ubuntu/workspace/urlshortener/node_modules/googleurl/lib/google.js:163:11) 在processImmediate[as_immediateCallback](timers.js:383:17)Javascript 为什么我在尝试访问下面代码中的db.collection时会得到一个未定义的值?,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,//当我尝试在这里调用我的db.collection方法时,我得到一个错误 声明TypeError:无法读取的属性“collection” 未定义 我已经确保全局声明了我的db变量,甚至还通过了 它将连接到check_db函数以确保 下面是完整的错误声明 TypeError:无法读取未定义的属性“collection” 在check_db(/home/ubuntu/workspace/urlshortener/server.js:45:7) 在/home/ubuntu/workspace/url
您的数据库未定义。您必须将其分配给connect回调中创建的db
function check_db(longUrl, shortUrl, db){
db.collection('sites').findOne({
'longUrl': longUrl,
'shortUrl': shortUrl
}, function(err, result){
if(err){
throw new Error(err);
}if(result){
console.log('This site already exists on the database');
}else{
console.log('This site does not exist on the database');
}
});
}
编辑:
正如@conceptquest的答案所指出的,您还必须保持连接打开,直到您的请求完成。您的数据库未定义。您必须将其分配给connect回调中创建的db
function check_db(longUrl, shortUrl, db){
db.collection('sites').findOne({
'longUrl': longUrl,
'shortUrl': shortUrl
}, function(err, result){
if(err){
throw new Error(err);
}if(result){
console.log('This site already exists on the database');
}else{
console.log('This site does not exist on the database');
}
});
}
编辑:
正如@conceptquest的答案所指出的,在您的请求完成之前,您还必须保持连接打开。您可以通过以下线路获得mongo连接:-
mongo.connect('mongodb://localhost:27017/url-shortener', function(err, newDb){
if(err){
throw new Error('Database failed to connect');
} else{
console.log('Successfully connected to MongoDB on port 27017');
}
db = newDb; // ADD THIS
db.createCollection('sites', {
autoIndexID: true
});
// db.close();
});
然后关闭内部的连接:-
mongo.connect('mongodb://localhost:27017/url-shortener', function(err, db){
请评论此关闭声明并重试。我认为应该行得通
如果您想使用相同的连接(这是一个很好的做法),请不要关闭连接。您可以在末尾关闭连接。您可以通过以下线路获得mongo连接:-
mongo.connect('mongodb://localhost:27017/url-shortener', function(err, newDb){
if(err){
throw new Error('Database failed to connect');
} else{
console.log('Successfully connected to MongoDB on port 27017');
}
db = newDb; // ADD THIS
db.createCollection('sites', {
autoIndexID: true
});
// db.close();
});
然后关闭内部的连接:-
mongo.connect('mongodb://localhost:27017/url-shortener', function(err, db){
请评论此关闭声明并重试。我认为应该行得通
如果您想使用相同的连接(这是一个很好的做法),请不要关闭连接。您可以在最后关闭连接。我看不出您在哪里初始化变量
db
db在mongo shell中是一个全局变量,但在node js中不是。@Mr.7-我在程序的第六行初始化它。@onceptquest-你是什么意思?它怎么可能是mongo shell内部的全局变量而不是节点js不要将APIKEY放入共享代码中我看不出您在哪里初始化变量db
db是mongo shell中的全局变量,但不是节点js中的全局变量。@Mr.7-我在程序的第六行初始化它。@onceptQuest-什么意思?它怎么可能是mongo shell中的全局变量,而不是节点JS中的全局变量呢?不要将APIKEY放入共享代码中,这样您的解决方案就可以工作了!谢谢但是,我现在在check_db函数中遇到了一个不同的问题,应用程序没有记录控制台语句。它进入findOne方法,但不进入回调。我尝试过通过调试器运行它,但没有成功!所以你的解决方案奏效了!谢谢但是,我现在在check_db函数中遇到了一个不同的问题,应用程序没有记录控制台语句。它进入findOne方法,但不进入回调。我尝试过通过调试器运行它,但没有成功!