node.js + perfectapiを使用してMongoDBに対してサーバー側 API を作成するにはどうすればよいですか?
このようにMongoデータベースをセットアップしました:
dbpath = /Users/me/srv/db
bind_ip = 127.0.0.1
noauth = true
verbose = true
次のような完璧なapiスクリプトsrv.js:
var mongo = require('mongodb'), Server = mongo.Server, Db = mongo.Db;
var db = new Db('timedb',new Server('localhost',27017,{auto_reconnect:true},{}));
db.open
(
function(error,unused)
{
if(error) console.log("Cannot connect to database.");
else console.log("We are now connected to the database.");
}
);
var perfectapi = require('perfectapi');
var path = require('path');
var configPath = path.resolve(__dirname,'api.json');
var parser = new perfectapi.Parser();
parser.on
(
"create",
function(config,callback)
{
console.log(config)
db.collection
(
'times',
function(error,collection)
{
if(error)
{
console.log("Error in collection");
callback(error);
}
else
{
console.log(config.options.time);
console.log("Success in collection");
collection.insert
(
config.options,
{safe:true},
function(error,callback)
{
if(error) console.log("Error inserting: "+error);
else
{
db.close();
callback(null,{"guid":"123"});
}
}
);
}
}
);
}
);
module.exports = parser.parse(configPath);
そして、次のような api.json :
{
"exports":"srv",
"path":"api/v1",
"signature":
[
{
"name":"create",
"synopsis":"Create a new record.",
"verb":"POST",
"options":
[
{"option":"time","required":true}
],
"returns":
[
{"name":"guid","description":"The ID of the new record."}
]
}
]
}
で実行すると
node srv.js create --time 2012-09-10
私は得る
{ environment: {}, options: { time: '2012-09-10' } }
2012-09-10
Success in collection
We are now connected to the database.
その後、スクリプトがハングし、ディスク上にデータベースが作成されません。一方、MongoDB を停止してスクリプトを再度実行すると、
{ environment: {}, options: { time: '2012-09-10' } }
2012-09-10
Success in collection
Cannot connect to database.
そしてスクリプトは終了します。