0

mongo-lite を使用して、同じ db 接続から複数の mongo コレクションにアクセスしようとしています。以下は Express アプリのサンプルです。

var express = require('express')   ;
var app = express();
var http = require('http');
var mongolite = require('mongo-lite');

db = mongolite.connect("mongodb://localhost/fnard", ['col1','col2']);
app.use(express.bodyParser());
app.use(app.router);

app.get('/', function(request, response){
    db.collection('col1').insert({hi:5},function(){});
    db.collection('col2').insert({hi:5},function(){});
    console.log(request.body);      // your JSON
    response.send(request.body);    // echo the result back
});

http.createServer(app).listen(3000, function () {
    console.log('Express server listening on port ' + '3000');
});

/でGETを実行すると発生するエラーは次のとおりです。

Error: A Server or ReplSetServers instance cannot be shared across multiple Db instances

ただし、次のコードを使用すると、GET は期待どおりにドキュメントを挿入します

var express = require('express')   ;
var app = express();
var http = require('http');
var mongolite = require('mongo-lite');

db = mongolite.connect("mongodb://localhost/fnard", ['col1']);
db2 = mongolite.connect("mongodb://localhost/fnard", ['col2']);
app.use(express.bodyParser());
app.use(app.router);

app.get('/', function(request, response){
    db.collection('col1').insert({hi:5},function(){});
    db2.collection('col2').insert({hi:5},function(){});
    console.log(request.body);      // your JSON
    response.send(request.body);    // echo the result back
});

アクセスしたいコレクションごとに新しい接続を本当に作成する必要がありますか? mongo-lite docs は、これが当てはまらないことを示唆しているようです - .connect() オプションを使用すると、使用するコレクションを指定できますが、機能していないようです。

mongo-lite ドキュメント リンク

4

1 に答える 1

1

競合状態によりエラーが発生しています。以下は私にとってはうまくいきます:

var express = require('express');
var app = express();
var http = require('http');
var mongolite = require('mongo-lite');

db = mongolite.connect("mongodb://localhost/fnard", ['col1','col2']);
app.use(express.bodyParser());
app.use(app.router);

app.get('/', function(request, response){
    db.collection('col1').insert({hi:5},function(){
        db.collection('col2').insert({hi:5},function(){
            console.log(request.body);      // your JSON
            response.send(request.body);    // echo the result back
        });
    });
});

http.createServer(app).listen(3000, function () {
    console.log('Express server listening on port ' + '3000');
});

コールバックをネストする必要があります。または、 asyncのようなライブラリを使用できます。

var express = require('express');
var async = require( 'async' );
var app = express();
var http = require('http');
var mongolite = require('mongo-lite');

db = mongolite.connect("mongodb://localhost/fnard", ['col1','col2']);
app.use(express.bodyParser());
app.use(app.router);

app.get('/', function(request, response){
    async.series( [

        // First insert
        function ( callback ) {
            db.collection('col1').insert({hi:5},callback);
        },

        // Second insert
        function ( callback ) {
            db.collection('col2').insert({hi:5},callback);
        }

    // Send response
    ], function ( error, results ) {
        console.log(request.body);      // your JSON
        response.send(request.body);    // echo the result back
    } );
});

http.createServer(app).listen(3000, function () {
    console.log('Express server listening on port ' + '3000');
});
于 2013-08-15T21:41:26.290 に答える