2013-08-21 79 views
1

我通過Mongoose使用Nodejs,ExpressJs,MongoDB。我創建了一個簡單的UserSchema。我將我的代碼分成多個文件,因爲我預見它們會變得複雜。不能返回值到貓鼬/ mongodb和nodejs的響應

URL'/ api/users'被配置爲調用'routes/user.js'中的列表函數,該函數按預期發生。 UserSchema的列表函數被調用,但它沒有返回任何東西給調用函數,因此沒有結果。

我在做什麼錯?

我試圖根據http://pixelhandler.com/blog/2012/02/09/develop-a-restful-api-using-node-js-with-express-and-mongoose/

我認爲我做錯了什麼與userSchema.statics.list

的功能定義,將其建模app.js

users_module = require('./custom_modules/users.js'); // I have separated the actual DB code into another file 
mongoose.connect('mongodb:// ******************'); 

var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function callback() { 
    users_module.init_users(); 
}); 

app.get('/api/users', user.list); 

custom_modules/users.js

function init_users() { 
    userSchema = mongoose.Schema({ 
     usernamename: String, 
     hash: String, 
    }); 

    userSchema.statics.list = function() { 
     this.find(function (err, users) { 
      if (!err) { 
       console.log("Got some data"); // this gets printed 

       return users; // the result remains the same if I replace this with return "hello" 
      } else { 
       return console.log(err); 
      } 
     }); 
    } 

    UserModel = mongoose.model('User', userSchema); 
} // end of init_users 

exports.init_users = init_users; 

路線/ user.js的

exports.list = function (req, res) { 
    UserModel.list(function (users) { 
     // this code never gets executed 
     console.log("Yay "); 

     return res.json(users); 
    }); 
} 
+0

它給出了什麼錯誤? –

回答

1

其實在你的代碼中傳遞一個回調,這是從來沒有在函數處理userSchema.statics.list

你可以試試下面的代碼:

userSchema.statics.list = function (calbck) {  
    this.find(function (err, users) { 
    if (!err) {   
     calbck(null, users); // this is firing the call back and first parameter should be always error object (according to guidelines). Here no error, so pass null (we can't skip) 
    } else {  
     return calbck(err, null); //here no result. But error object. (Here second parameter is optional if skipped by default it will be undefined in callback function) 
     } 
    });  
} 

因此,您應該更改傳遞給此函數的回調。即

exports.list = function (req, res){ 
UserModel.list(function(err, users) { 
    if(err) {return console.log(err);} 
    return res.json(users); 
    }); 
} 
+0

太棒了!這完美的作品! –

+0

是的。會做 。測試一下。 –

+0

今天我學到了很多新東西。我總是認爲回調會被自己調用。到目前爲止,我使用的函數已經在其定義中定義了回調函數。所以我剛剛使用了它們,並假設每個函數都可以有回調,並且在函數完成後自動執行回調。 –