var express = require('express');
var GoogleUrl = require('google-url');
var favicon = require('serve-favicon');
var mongo = require('mongodb').MongoClient;
var app = express();
var db;
var googleUrl = new GoogleUrl({key: '********'});
var PORT = 8080;
mongo.connect('mongodb://localhost:27017/url-shortener', function(err, db){
if(err){
throw new Error('Database failed to connect');
} else{
console.log('Successfully connected to MongoDB on port 27017');
}
db.createCollection('sites', {
autoIndexID: true
});
db.close();
});
app.use(favicon(__dirname+'/public/favicon.ico'));
app.get('/new/*', function(req, res){
console.log('This is the url: '+req.params[0]);
googleUrl.shorten(req.params[0], function(err, shortUrl){
if(err){
console.log(err);
}else{
console.log(shortUrl);
}
check_db(req.params[0], shortUrl, db);
});
});
app.listen(PORT, function(){
console.log('Express listening on: '+PORT);
});
//当我尝试在这里调用我的db.collection方法时,我收到一个错误 语句说TypeError:无法读取属性'collection'的 未定义。
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');
}
});
}
我确保全局声明我的db变量,我甚至通过了 它到check_db函数来确保。
以下是完整的错误陈述
TypeError:无法读取未定义的属性“集合” 在check_db(/home/ubuntu/workspace/urlshortener/server.js:45:7) 在/home/ubuntu/workspace/urlshortener/server.js:35:8 在/home/ubuntu/workspace/urlshortener/node_modules/google-url/lib/google.js:18:7 在Immediate._onImmediate(/home/ubuntu/workspace/urlshortener/node_modules/google-url/lib/google.js:163:11) at processImmediate [as _immediateCallback](timers.js:383:17)
答案 0 :(得分:1)
您的数据库未定义。您必须在连接回调中将其分配给创建的数据库。
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();
});
编辑:
正如@notionquest的回答所指出的那样,你必须保持连接处于打开状态,直到你的请求完成为止。
答案 1 :(得分:1)
您可以在以下行中获得mongo连接: -
mongo.connect('mongodb://localhost:27017/url-shortener', function(err, db){
然后关闭内部的连接: -
db.close();
请评论此紧密声明并尝试。我认为它应该有用。
如果您想使用相同的连接(这是一种很好的做法),请不要关闭连接。您可以在最后关闭连接。