Javascript 为什么我在尝试访问下面代码中的db.collection时会得到一个未定义的值?

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

//当我尝试在这里调用我的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)


您的数据库未定义。您必须将其分配给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方法,但不进入回调。我尝试过通过调试器运行它,但没有成功!