4

私はNode.JSを初めて使用しますが、これに対する解決策を見つけることができません。mongoからデータを取得するためのRESTfulサービスを構築しています。

app.js

var database = require('./database.js');
...

app.get('/metadata', function(req, res) {
    console.log("GET: metadata");
    res.send(database.getMetadata(null));
});

app.get('/metadata/:id', function(req, res) {
    console.log("GET: metadata");
    res.send(database.getMetadata(req.params.id));
});
...

database.js

exports.getMetadata = function (id) {
    console.log('getting metada...')
    if (id == null) {
        return FolderInfo.find({}, null, null, function (err, metadatas) {
            if (!err) {
                console.log(metadatas);
                return metadatas;
            } else {
                return console.log(err);
            }
        });
    }
    else {
        return FolderInfo.findById(id, function (err, metadatas) {
            if (!err) {
                return metadatas;
            } else {
                return console.log(err);
            }
        });
    }
}

私は多くの異なるアプローチを試しました。しかし、常に結果としてこれを取得します。

{
    options: {
        populate: { }
    },
    _conditions: { },
    _updateArg: { },
    op: "find"
}

しかし、私のconsole.log(metadatas); 行は結果をコンソールに出力しています。最新のパッケージをすべて使用しています。誰かが私を助けることができますか?

4

1 に答える 1

10

非同期操作の基本的な性質である「今すぐ終了し、後で完了するreturn」に反するため、同期をのような非同期関数と実際に混在させることはできません。findById

後で完了したときにgetMetadata呼び出すことができるコールバック関数を受け入れるように調整する必要があります。findById

exports.getMetadata = function (id, callback) {
   // ...
};

そして、 :metadatasがない場合にのみ戻るのではなくerr

if (!err) {
    return metadatas;
} else {
   // ...
}

callbackどちらの場合も、を呼び出す必要があります。

callback(err, err ? null : metadatas);

コンテキストでは、次のようになります。

FolderInfo.find({}, null, null, function (err, metadatas) {
    if (err) {
        console.log(err);
    } else {
        console.log(metadatas);
    }

    callback(err, err ? null : metadatas);
});

またはおそらくちょうど:

FolderInfo.find({}, null, null, callback);

次にgetMetadata、呼び出されたときに応答を処理するコールバック関数を渡します。

app.get('/metadata', function(req, res) {
    console.log("GET: metadata");
    database.getMetadata(null, function (err, data) {
        res.send(data);
    });
});
于 2012-08-31T18:47:50.603 に答える