我想通过节点访问远程mongodb数据。在我的app.js中写了以下内容:
var mongo = require('mongodb');
var MongoClient = require('mongodb').MongoClient;
var db = MongoClient.connect("mongodb://remote_url:27017/databasetest");
//db name is : databasetest
app.use(function(req,res,next){
req.db = db;
next();
});
以下是从db:
访问集合的apirouter.get('/get', function(req, res, next) {
var db = req.db;
var collection = db.get('test');
collection.find({},function(e,docs){
res.json(docs);
});
});
访问API时出现以下错误:
db.get不是函数
有人可以帮助我同样的
答案 0 :(得分:2)
mongo db连接字符串具有此格式,您没有用户名和密码
mongodb://<user>:<password>@<url>:<port>/<database>
对于测试连接,可能很容易在mlab.com中使用测试帐户,它只需要两分钟即可免费使用。
1.第一步测试连接
var MongoClient = require('mongodb').MongoClient;
// Connect to the db
MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db) {
if(!err) {
console.log("We are connected");
}
});
//测试后,请替换
console.log(&#34;我们已连接&#34;);
代表
db.collection('test').find( <your query> )
答案 1 :(得分:2)
我假设您使用的是最近版本的node.js MongoDB驱动程序(目前版本为2.2.4)。
立即想到的一个问题是代码中的这一行:
var db = MongoClient.connect("mongodb://remote_url:27017/databasetest");
MongoClient.connect()
函数需要一个回调参数,否则它将返回一个Promise。但是,您的后续代码不会将变量db
视为承诺。
此外,您正试图从db
对象获取(并设置)req
变量。此req
对象包含HTTP请求,并具有请求查询字符串,参数,正文,HTTP标头等的属性。这是您看到的错误的来源。
这是我可以使用Express在db.test.find().toArray()
shell中提供与mongo
命令等效的最小工作示例:
var MongoClient = require('mongodb').MongoClient
var assert = require('assert')
var express = require('express')
var app = express()
var db = null
MongoClient.connect('mongodb://localhost:27017/test', function(err,database) {
assert.equal(err,null)
db = database
})
app.get('/', function(req,res) {
db.collection('test').find({}).toArray(function(err,doc) {
assert.equal(err,null)
res.send(JSON.stringify(doc))
})
})
app.listen(3000, function() {
console.log('Listening on port 3000')
})
请注意,在上面的示例中,我使用全局db
变量来存储由MongoClient.connect()
创建的MongoDB数据库连接。如果感觉更自然,请随意使用Promises进行实验。
有关MongoClient类的更多详细信息,请参阅http://mongodb.github.io/node-mongodb-native/2.1/api/MongoClient.html