【问题标题】:Cannot return values to response with mongoose/mongodb and nodejs无法使用 mongoose/mongodb 和 nodejs 返回值以响应
【发布时间】:2013-08-23 10:09:04
【问题描述】:

我正在通过 Mongoose 使用 Nodejs、ExpressJs、MongoDB。我创建了一个简单的 UserSchema 。我将代码分成多个文件,因为我预见它们会变得复杂。

url '/api/users' 被配置为调用'routes/user.js' 中的列表函数,这正如预期的那样。 UserSchema 的 list 函数确实被调用了,但它没有向调用函数返回任何内容,因此没有结果输出。

我做错了什么?

我尝试根据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;

routes/user.js

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

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

【问题讨论】:

  • 报错了吗?

标签: javascript node.js mongodb mongoose


【解决方案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);
  });
} 

【讨论】:

  • 是的。会做 。测试一下。
  • 我今天学到了很多新东西。我一直认为回调是自己调用的。到目前为止,我使用的函数已经在其定义中定义了回调。所以我只是利用它们并假设每个函数都可以有一个回调,并且回调会在函数完成后自动执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 2021-08-13
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多