Это сообщение было изначально опубликовано с помощью вопроса.Мод попросил его в комментариях опубликовать его как ответ, но ответа не получил.Итак, я очистил его и выкладываю сам.
Когда вы посмотрите на код, вы заметите, что код createServer
находится внутри db.open
.Это не сработает, если вы измените это.Кроме того, не закрывать соединение БД.В противном случае, после первого раза соединение с БД не будет снова открыто.(Конечно, db.open
объявлено вне createServer
.) Я понятия не имею, почему createServer
находится внутри db.open
.Я полагаю, это может быть связано с тем, что вы не открываете слишком много соединений с БД?
Кроме того, одна проблема, с которой я сталкиваюсь, заключается в том, что при запуске через SSH, даже если сервер работает в фоновом режиме (например, $ node server.js &
), через 2,5 часа сервер умирает (но не экземпляр).Я не уверен, если это из-за терминального подключения или что.
Вот процедура и код
Среда: EC2, AMS-Linux-AMI
Цель: принять HTTP-запрос и зарегистрировать запрос, IP-адрес и метку времени в MongoDB.
Шаги
1) После создания экземпляра (сервера) установитеНКА.
$ 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) Я рекомендую вам создать свой собственный 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');
Это может не быть perfect code, но он работает.Я до сих пор не привык к «вложенному» или LISP-стилю кодирования.Вот почему я обманул и использовал global.inData
для передачи данных.:)
Не забудьте поместить res.end("")
в соответствующем месте (где, по вашему мнению, следует завершить вызов HTTP-запроса).