Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 蓝鸟承诺在快车/猫鼬中过早返回_Node.js_Express_Mongoose_Promise_Bluebird - Fatal编程技术网

Node.js 蓝鸟承诺在快车/猫鼬中过早返回

Node.js 蓝鸟承诺在快车/猫鼬中过早返回,node.js,express,mongoose,promise,bluebird,Node.js,Express,Mongoose,Promise,Bluebird,我对承诺不熟悉,不知道为什么下面的方法不起作用。我之所以这样假设,是因为我需要用一种特定的方式设置我的自定义方法来处理承诺 我用蓝鸟作为我的承诺图书馆。我试图通过在这些模型(即讨论和用户模型)上使用mongoose静态和方法,获得给定“用户”用户名的“讨论”对象列表 下面是我在Express中的请求处理程序。现在只是尝试获取JSON并将其作为响应发送: /* /routes/users.js */ var Promise = require('bluebird'); var User = re

我对承诺不熟悉,不知道为什么下面的方法不起作用。我之所以这样假设,是因为我需要用一种特定的方式设置我的自定义方法来处理承诺

我用蓝鸟作为我的承诺图书馆。我试图通过在这些模型(即讨论和用户模型)上使用mongoose静态和方法,获得给定“用户”用户名的“讨论”对象列表

下面是我在Express中的请求处理程序。现在只是尝试获取JSON并将其作为响应发送:

/* /routes/users.js */

var Promise = require('bluebird');
var User = require('../models/').User

/* ... express inclusions, other routes ... */

/* Get list of discussions for user */
router.get('/:username/discussions', function(req, res) {
    User.findOne({username: req.params.username}).then(function(user) {
        if (user) {
            return user.getDiscussions();
        } else {
            res.send('no user found');
        }
    }).then(function(discussions) {
        res.send(discussions);
    }).catch(function(error) {
        console.log('ERROR: ' + error);
        res.send('ERROR: ' + error);
    });
});
下面是user.getDiscussions():

最后是Discussion.getDiscussionsForUser:

/* /models/discussion.js */

var Promise = require('bluebird');
var mongoose = Promise.promisifyAll(require('mongoose'));
var Schema = mongoose.Schema;

/* ... DiscussionSchema defined here ... */

DiscussionSchema.statics.getDiscussionsForUser = Promise.method(function(username) {
    var self = this;
    self.model('User').findOne({username: username}, 'discussions').then(function(user) {
        if (!user) {
            return Promise.reject('User with username \'' + username + '\' does not exist.');
        } else {
            var discussions = [];
            return self.model('Discussion').find({
                '_id': { $in : user.discussions }
            });
        }
    });
});
路由中的请求似乎提前完成,并在响应中发送未定义的请求。你知道为什么在讨论模型中从Mongoose获得的讨论没有出现在路线上吗?

getDiscussions()
getDiscussionsForUser()
没有正确地返回承诺。更改如下:

UserSchema.methods.getDiscussions = Promise.method(function() {
    var self = this;
    // *** added a return to this next line
    return self.model('User').findById(self.id).then(function(user) {
        if (!user) {
            // *** added a return to this next line
            return Promise.reject('User \'' + self.id + '\' does not exist.');
        } else {
            return Discussion.getDiscussionsForUser(self.username);
        }
    });
});
getDiscussionsForUser()
相同,应该是:

DiscussionSchema.statics.getDiscussionsForUser = Promise.method(function(username) {
    var self = this;
    // *** added a return to the next line
    return self.model('User').findOne({username: username}, 'discussions').then(function(user) {
        if (!user) {
            return Promise.reject('User with username \'' + username + '\' does not exist.');
        } else {
            var discussions = [];
            return self.model('Discussion').find({
                '_id': { $in : user.discussions }
            });
        }
    });
});

为了使调用方能够使用承诺协调函数内异步操作的完成,通过函数的所有代码路径必须始终从该函数返回承诺。一旦进入
.then()
处理程序,如果存在进一步的嵌套异步操作,则必须返回一个承诺,或者如果希望该值成为所处承诺的值,则可以只返回一个值。

Doh!谢谢我已经看了一段时间了,但是在最初找到用户之后,我太专注于每个函数的内部工作。
DiscussionSchema.statics.getDiscussionsForUser = Promise.method(function(username) {
    var self = this;
    // *** added a return to the next line
    return self.model('User').findOne({username: username}, 'discussions').then(function(user) {
        if (!user) {
            return Promise.reject('User with username \'' + username + '\' does not exist.');
        } else {
            var discussions = [];
            return self.model('Discussion').find({
                '_id': { $in : user.discussions }
            });
        }
    });
});