未处理的拒绝范围错误:无效的状态代码:0

时间:2017-08-22 13:33:08

标签: node.js mongodb promise unhandled

我遇到了这个问题,我无法摆脱它。 我要做的就是发布“帖子”(json),将其保存到MongoDB中。

exports.create_a_topic = function(req, res) {
return new Promise((resolve,reject) => {

var newTopic = new Topic({
    topic_type: req.body.topic_type,
    properties: req.body.properties[0]
});

newTopic.save()
.then(() => resolve({ status: 201, message: 'Topic published Successfully!' }))
    .catch((err) => {
        if (err.code == 11000) {
            reject({ status: 409, message: 'Topic Already published!' });
        } else {
            reject({ status: 500, message: 'Internal Server Error!' });
        }
    }); 
})};

然后,我将收到所有订阅此类帖子的人。 (任何用户可能在帖子的元数据上有或没有过滤器)

exports.get_subscribers = function(req, res) { 
return new Promise((resolve,reject) => {
User.find({subscription: req.body.topic_type}, {'email': 1, 'queueName': 1, 'isFiltered': 1})
.then(users => {
        if (users.length == 0) {
            reject({ status: 404, message: 'Users Not Found!' });
        } else {
            //res.subscribers = {};
            res.subscribers = users;
            resolve({ status: 200, message: users });
        }
})
.catch(err => reject({ status: 500, message: 'Internal Server Error!' }));
})};

最后,从所有订阅者的列表中,我将仅使用过滤器将其应用于帖子的元数据并查看该用户是否对其感兴趣。 (用户模式具有引用Filter模式的电子邮件,因此我将在它们之间进行聚合以查看用户是否具有过滤器)。如果没有人有过滤器,我会返回订阅者列表而不删除任何过滤器,否则我会删除对帖子不感兴趣的人。) 我仍然需要实现删除部分。

exports.apply_filter = function(req, res, subscribers)  {
var email_of_filters = [];

subscribers.forEach(function(value) {
        email_of_filters.push(value.email); 
});
console.log(email_of_filters);

return new Promise((resolve,reject) => {

    User.aggregate([
        {$project: {"email": "$email", "filter": "$filter"}},
        {$match: {isFiltered: {$ne: false}, email: {$in: email_of_filters}}},
        {$unwind: "$email"},
        {$lookup: 
            {from: "filters", localField: "email", foreignField: "email", as: "filter"}
        }
    ])

    .then(users_with_filters => {

        if (users_with_filters.length == 0) {
            resolve({ status: 200, message: subscribers });
        } else {
            reject({ status: 400, message: 'Error!' });
        }
    })
    .catch(err => reject({ status: 500, message: 'Internal server error!' }));
});
};

'get_subscribers'如果单独调用它会很顺利。 'create_a_topic'也是如此。 调用apply_filter时会遇到问题。

  

未处理的拒绝范围错误:无效的状态代码:0

我在StackOverflow上看到了以下问题而没有解析:123。 任何提示都将不胜感激。

路线

app.post('/publish_topic', (req, res) => {
        project.create_a_topic(req, res)
            .then(result1 => {return project.get_subscribers(req, res);})
            .then(result2 => {return project.apply_filter(req, res, res.subscribers);})
            .then(result3 => {res.status(result3.status).json({ message: result3.message });})
            .catch(err => res.status(err.status >= 100 && err.status < 600 ? err.code : 500).send({message: err.message}))          
    });

2 个答案:

答案 0 :(得分:2)

发现路线中存在的问题: 而不是

.catch(err => res.status(err.status >= 100 && err.status < 600 ? err.code: 500).send({message: err.message}))

我应该用

.catch(err => res.status(err.status >= 100 && err.status < 600 ? **err.status**: 500).send({message: err.message}))

所以,问题是

  

err.code

而不是

  

err.status

顺便说一句,我会按照上面的提示进行操作。 谢谢大家!

答案 1 :(得分:1)

经常让我摆脱困境的是小型,可测试,承诺返回的单位。以第一个函数为例,使其成为模型函数,让控制器管理reqres。让它直接从数据库执行模型工作并返回承诺。

exports.create_a_topic = function(topicType, topicProperties) {
    let newTopic = new Topic({
        topic_type: topicType,
        properties: topicProperties
    });
    // important: return the promise returned by save...
    return newTopic.save();
})

与第二个功能类似......

exports.get_subscribers = function(topicType) { 
    return User.find({subscription: topicType}, {'email': 1, 'queueName': 1, 'isFiltered': 1});
})

这里有两个......

exports.create_a_topic_and_get_subscribers = function(topicType, topicProperties) {
    var result = {};
    return create_a_topic(topicType, topicProperties)
    .then((topic) => result.topic = topic)
    .then(() => get_subscribers(topicType) )
    .then((subscribers) => {
        result.subscribers = subscribers
        return result
    });
}

等等。让控制器从请求中拉出参数并根据模型函数的工作方式排列响应。换句话说......

app.post('/test_publish_topic', (req, res) => {
    let topicType = req.body.topic_type;
    let topicProperties = req.body.properties[0];
    project.create_a_topic_and_get_subscribers(topicType, topicProperties)
    .then((result) => res.status(200).json(result))
    .catch((error) => res.status(500).json(error))
});

关键是要将它们创建为小承诺返回单位。建立一些测试个人的路线。您可以在控制器中对模型单元进行链接,并将req和res的操作留给控制器。