0

現在、mongodb コレクション「メディア」から属性「タイトル」と「作成者」を取得するのに問題があります (特に、これらは説明のための 2 つにすぎません)。次のコードは、「undefined to console」を出力します。

var db = require('monk')(config['dbPath']);
var medialist = db.get('media');
var foundItems = medialist.find();
var firstFoundItem = JSON.stringify(foundItems[0]);
console.log(firstFoundItem);

また、サーバーが起動すると、コンソールに次のメッセージが表示されます。

"{ [エラー: モジュール '../build/Release/bson' が見つかりません] コード 'MODULE_NOT_FOUND'} js-bson: 純粋な JS バージョンを使用して、c++ bson 拡張機能を読み込めませんでした"

そのエラー メッセージを Google で検索した後、npm bson のインストールなど、いくつかの解決策を試しました。動作していないのは私のコードだけですか、それとも不足しているモジュール (またはその両方) ですか?

ありがとう、

ミュージカル

編集:@hassansinが非同期呼び出しについて提案したことに従って、私は次のことを試しました

 var err;
    var params = req.params;
    mongoHandler.getMedia(err, params)
        .then(function(itemList) {
            if (!err) {
                var firstFoundItem = JSON.stringify(itemList[0]);
                console.log(firstFoundItem);
                res.sendFile('medialist.html', {
                    root: './public/views/'
                });
            } else {
                res.sendFile('errorpage.html', {
                    root: './public/views/'
                });
            }
        });
});

mongoHandler は次のモジュールです。

var config = require('../config.json');
//var db = require('monk')('localhost:27017/bookwyrm');
var mongo = require('mongodb');

var server = new mongo.Server('localhost', 27017, {
    auto_reconnect: true
});

var db = new mongo.Db('bookwyrm', server);



function getMedia(err, params) {
    var callback = {};
    asyncGet(err, callback);

    if (!err) {
        return callback.items;
    } else {
        console.log("Connection or query to mongodb failed");
    }
}

function asyncGet(err, callback) {
    db.open(function(err, db) {
        if (!err) {
            db.collection('media', function(err, collection) {
                if (!err) {
                    collection.find(params).toArray(function(err, items) {
                        if (!err) {
                            db.close();
                            callback.items = items;
                        } else {
                            errorHandler(err, callback);
                        }
                    })
                } else {
                    errorHandler(err, callback);
                }
            })
        } else {
            errorHandler(err, callback);
        }
    });
}

function errorHandler(err, callback) {
    if (!db) {
        db.close()
    };
    callback.err = err;
}


module.exports.getMedia = getMedia;
4

1 に答える 1

1

スクリプトにはいくつかの問題があります。最初にデータベース名を指定しませんでした。2 つ目findは非同期操作であり、async メソッドの戻り値を読み取っても結果が得られません。

var db = require('monk')('localhost:27017/dbname'); // <- database name
var medialist = db.get('media');
medialist.find({})
 .then(function(foundItems){   // <- use promise or callback to get result
   var firstFoundItem = JSON.stringify(foundItems[0]);
   console.log(firstFoundItem);
  })
于 2015-08-09T05:32:40.370 に答える