我得到了很多人的帮助,现在我想回馈.对于那些使Node.js服务器与MongoDB一起工作有困难的人来说,这就是我所做的.
Pop*_*ops 10
这最初是由提问者发布的.一位国会议员在评论中要求他将其作为答案发布,但没有得到回应.所以,我把它清理干净,然后自己发布.
当您查看代码时,您会注意到createServer
代码在里面db.open
.如果你反转它将无法工作.另外,不要关闭数据库连接.否则,在第一次之后,将不再打开db连接.(当然,db.open
在外面声明createServer
.)我不知道为什么createServer
在里面db.open
.我想这可能与不打开太多数据库连接有关?
另外,我遇到的一个问题是,当我通过SSH运行它时,即使我在后台运行服务器(例如$ node server.js &
),2.5小时后,服务器也会死(但不是实例).我不确定是否是因为终端连接或什么.
这是程序和代码
环境:EC2,AMS-Linux-AMI
目的:获取HTTP请求并将查询,IP和时间戳记录到MongoDB中.
脚步
1)创建实例(服务器)后,安装gcc.
$ yum install gcc-c++
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我将解压缩的文件夹重命名为"nodejs"
$ cd nodejs
$ sudo ./configure --without-ssl
$ sudo make
$ sudo make install
Run Code Online (Sandbox Code Playgroud)
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/
Run Code Online (Sandbox Code Playgroud)
我将文件夹重命名为"mongodb"
运行db进程:
$ ./mongodb/bin/mongod --dbpath /data/db/r01/
Run Code Online (Sandbox Code Playgroud)
然后,如果您愿意,可以运行并尝试命令行.请参阅MongoDB的网站.
4)我建议您根据实例创建自己的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
Run Code Online (Sandbox Code Playgroud)
我将文件夹重命名为 node-mongodb-native
$ cd node-mongodb-native
$ make
Run Code Online (Sandbox Code Playgroud)
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');
Run Code Online (Sandbox Code Playgroud)
这可能不是完美的代码,但它运行.我还不习惯"嵌套"或LISP编码风格.这就是我欺骗并习惯global.inData
传递数据的原因.:)
不要忘记放入res.end("")
适当的位置(您认为应该结束HTTP请求调用).
归档时间: |
|
查看次数: |
11936 次 |
最近记录: |