2012-08-28 62 views
2

我正在使用Node.js,Express,MongoDB和Mongoose。我有一個函數可以獲取MongoDB數據庫中文檔的最大ID號並將其返回給程序。我已經開始模塊化我的代碼,並已將該功能遷移到另一個模塊。我已經成功地訪問了我的主模塊中的函數,但它涉及異步數據庫查詢。當該函數返回一個值時,我想將其分配給一個變量。不幸的是,當返回的值被分配給變量時,變量實際上被設置爲undefined。我正在考慮使用事件發射器來表示查詢已完成,但也提出了兩個問題:Node.js使變量等待分配,直到回調函數完成

1)我不認爲你可以在程序之後做任何事情,在返回語句後,這將是什麼是必須的。

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[email protected]: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; 
      } 
     }); 
    }; 
}; 

回答

3

你需要有接受它會調用的回調參數: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); 
     } 
    }); 
}; 
+0

只是爲了學習,爲什麼你有null作爲第一個參數? –

+0

節點約定是回調的第一個參數總是表示是否有錯誤。請參閱if(err)塊中的'callback(err);'語句。 – JohnnyHK