【问题标题】:Unhandled rejection rangerror: invalid status code: 0未处理的拒绝范围错误:无效状态代码:0
【发布时间】:2017-08-22 13:33:08
【问题描述】:

我遇到了这个问题,我无法摆脱它。 我要做的是发布“帖子”(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!' }));
})};

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

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}))          
    });

【问题讨论】:

标签: node.js mongodb promise unhandled


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

等等。让控制器从 req 中提取参数并根据模型函数的工作方式安排响应。也就是说……

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 的操作留给控制器。

【讨论】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-10
      • 1970-01-01
      • 2018-06-10
      • 2018-06-21
      • 2021-12-13
      • 2018-12-24
      • 2021-07-26
      • 1970-01-01
      • 2017-06-08
      相关资源
      最近更新 更多