2

Node.js、Express、MongoDB、および Mongoose を使用しています。MongoDB データベース内のドキュメントの最大 ID 番号をフェッチし、それをプログラムに返す関数があります。コードのモジュール化を開始し、その機能を別のモジュールに移行しました。メイン モジュールの関数に正常にアクセスできましたが、非同期データベース クエリが含まれています。関数は値を返すので、それを変数に代入したいと考えています。残念ながら、戻り値が変数に割り当てられると、変数は実際には未定義に設定されます。クエリが終了したことを通知するためにイベント エミッターを使用することを考えていましたが、それには次の 2 つの問題もあります。

1) return ステートメントの後で、プログラム内で何もできないと思います。これは必要なことです。

2) モジュール間のイベント エミッターは非常に扱いにくいようです。

変数を正しい値に割り当てるのを手伝ってください。メイン関数とモジュールの両方のコードは次のとおりです。

(メインファイル) app.js:

//requires and start up app
var express = require('express');
var mongoose = require('mongoose')
  , dbURI = 'localhost/test';
var app = express();
var postmodel = require('./models/post').postmodel;

//configures app for general stuff needed such as bodyParser and static file directory
app.configure(function () {
    app.use(express.bodyParser());
    app.use(express.static(__dirname + '/static'));
});

//configures app for production, connects to mongoLab databse rather than localhost
app.configure('production', function () {
    dbURI = 'mongodb://brad.ross.35:lockirlornie@ds037387.mongolab.com:37387/heroku_app6901832';
});

//tries to connect to database.
mongoose.connect(dbURI);
//once connection to database is open, then rest of app runs
mongoose.connection.on('open', function () {
    var PostModel = new postmodel();
    var Post = PostModel.setupPostSchema();
    var largest_id = PostModel.findLargestID(Post);

(モジュール) post.js:

var mongoose = require('mongoose');

module.exports.postmodel = function () {
    this.setupPostSchema = function () {
        var postSchema = new mongoose.Schema({
                title: String,
                body: String,
                id: Number,
                date_created: String
            });

        var Post = mongoose.model('Post', postSchema);
        return Post;
    };

    this.findLargestID = function (Post) {
        Post.find(function (err, posts) {
            if (err) {
                console.log("error finding largest ID!");
            } else {
                var largest_id = 0;
                for (var post in posts) {
                    if (posts[post].id >= largest_id) largest_id = posts[post].id;
                }
                console.log(largest_id);
                return largest_id;
            }
        });
    };
};
4

1 に答える 1

3

findLargestID利用可能になったら呼び出すコールバック パラメータを受け入れる必要largest_idがあります。

this.findLargestID = function (Post, callback) {
    Post.find(function (err, posts) {
        if (err) {
            console.log("error finding largest ID!");
            callback(err);
        } else {
            var largest_id = 0;
            for (var post in posts) {
                if (posts[post].id >= largest_id) largest_id = posts[post].id;
            }
            console.log(largest_id);
            callback(null, largest_id);
        }
    });
};
于 2012-08-28T15:38:24.240 に答える