如何在EC2环境中使用node-mongodb-native在Node.js服务器上设置MongoDB?
我在这里得到很多人的帮助,现在我想回馈。 对于那些无法使Node.js服务器在MongoDB中工作的人来说,这是我所做的。
这最初是由提问者发布的。 一个国防部在评论中要求他作为回答张贴,但没有回应。 所以,我把它清理干净,然后自己发布。
当你看代码时,你会注意到createServer
代码在db.open
里面。 如果你反转它,它将不起作用。 另外, 不要closures数据库连接。 否则,第一次之后,db连接将不会再次打开。 (当然, db.open
是在createServer
之外声明的。)我不知道为什么createServer
在db.open
里面。 我想这可能与不打开太多的数据库连接?
另外,我面对的一个问题是,当我通过SSH运行它,即使我在后台运行服务器(例如$ node server.js &
),2.5小时后,服务器死亡(不是实例)。 我不确定是因为terminal连接还是什么。
这是程序和代码
环境:EC2,AMS-Linux-AMI
目的:获取HTTP请求并将查询,IP和时间戳logging到MongoDB中。
脚步
1)创build实例(服务器)后,安装gcc。
$ yum install gcc-c++
2)下载Node.js文件并解压缩。 (我使用的是2.6版本。)
$ curl -O http://nodejs.org/dist/node-v0.2.6.tar.gz $ tar -xzf node-v0.2.6.tar.gz
我将解压后的文件夹重命名为“nodejs”
$ cd nodejs $ sudo ./configure --without-ssl $ sudo make $ sudo make install
make
需要很长时间….之后,您可以尝试在nodejs.org中运行示例
3)安装MongoDB。 我安装了版本1.6.5,而不是1.7。
$ curl -O http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.6.5.tgz $ tar -xzf mongodb-linux-x86_64-1.6.5.tgz $ sudo mkdir /data/db/r01/
我把这个文件夹改名为“mongodb”
运行db进程:
$ ./mongodb/bin/mongod --dbpath /data/db/r01/
然后如果你喜欢,你可以运行并尝试命令行。 请参阅MongoDB的网站。
4)我build议你根据你的实例创build你自己的AIM。 这将需要20分钟。 然后,重新安装并重新运行MongoDB。
5)安装node-mongodb-native
$ curl -O https://download.github.com/christkv-node-mongodb-native-V0.8.1-91-g54525d8.tar.gz $ tar -xzf christkv-node-mongodb-native-V0.8.1-91-g54525d8.tar.gz
我将该文件夹重命名为node-mongodb-native
$ cd node-mongodb-native $ make
6)这是服务器的代码:
GLOBAL.DEBUG = true; global.inData = ''; var http = require('http'); sys = require("sys"); /* set up DB */ var Db = require('./node-mongodb-native/lib/mongodb').Db, Connection = require('./node-mongodb-native/lib/mongodb').Connection, Server = require('./node-mongodb-native/lib/mongodb').Server, BSON = require('./node-mongodb-native/lib/mongodb').BSONNative; var host = process.env['MONGO_NODE_DRIVER_HOST'] != null ? process.env['MONGO_NODE_DRIVER_HOST'] : 'localhost'; var port = process.env['MONGO_NODE_DRIVER_PORT'] != null ? process.env['MONGO_NODE_DRIVER_PORT'] : Connection.DEFAULT_PORT; var db = new Db('test01', new Server(host, port, {}), {native_parser:true}); db.open(function(err, db) { http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); global.inData = {'p':'', 'url':''}; // get IP address var ipAddress = req.connection.remoteAddress; global.inData.ip = ipAddress; // date time var d = new Date(); var ts = d.valueOf(); global.inData.ts = ts; // get the http query var qs = {}; qs = require('url').parse(req.url, true); if (qs.query !== null) { for (var key in qs.query) { if (key == 'p') { global.inData.p = qs.query[key]; } if (key == 'url') { global.inData.url = qs.query[key]; } } } if (global.inData.p == '' && global.inData.url == '') { res.end(""); } else { db.collection('clickCount', function(err, collection) { if (err) { console.log('is error \n' + err); } collection.insert({'p':global.inData.p, 'url':global.inData.url, 'ip':global.inData.ip, 'ts':global.inData.ts}); res.end(""); //db.close(); // DO NOT CLOSE THE CONNECTION }); } }).listen(8080); }); console.log('Server running at whatever host :8080');
这可能不是完美的代码,但它运行。 我还不习惯“嵌套”或LISPtypes的编码风格。 这就是为什么我欺骗并使用global.inData
来传递数据。 🙂
不要忘记把res.end("")
放在适当的位置(你认为HTTP请求调用应该结束)。
顺便说一下,我上面发布的答案适用于CentOS和Fedora。
对于有Ubuntu的人来说,这里是:
# for Gcc $ sudo apt-get install build-essential # for SSL $ sudo apt-get install libssl-dev
然后按照上面的描述安装node.js和mongodb。
此外,经过几个月的发展,我发现使用“npm”,“express”和“mongoose”可以使我的生活更加轻松。 此外,我已经安装了其他工具,如debugging器。
# Install Node Package Manager $ sudo curl http://npmjs.org/install.sh | sh # for debugging $ sudo npm install node-inspector # for Profiling $ sudo npm install profile # Install Express, the Node.js framework $ sudo npm install express # Install Template Engines (Now, let's install Jade, jQuery Templates and EJS. You can pick the one you want) $ sudo npm install jade jqtpl ejs # XML related, install node-expat and then node-xml2js-expat $ sudo apt-get install -y libexpat1-dev $ sudo npm install node-xml2js $ sudo npm install xml2js-expat # Install Mongoose, (Mongo Driver) $ sudo npm install mongoose
参考: http : //npmjs.org
看起来可能有一个错误。 它不会允许我在a:b里面的collection.insert({
它把第一个农场当作“a”或硬编码的方式。
我会研究这个并在github上发布一个修复
- 多维数据集生成无法解释的数字
- Mongoose用$ in查找数组
- MongoCRauthentication是否可以使用Compose.io?
- MongoDB和Mongoose:如何查找和删除大量文档。 findAndModify(… {remove:true})?
- 保存条目后,nodejs mongoose不会返回到控制台
- 当modelObject从数据库本身获得时,modelObject.save()是否只更新现有的数据库文档?
- Heroku上的Node.js Express App不会使用Mongoose连接到MongoLab数据库
- NodeJS + Mongo如何查找并返回JSON
- 从数组获取最新的子文档