Unhandled rejection rangerror: invalid status code: 0

Unhandled rejection rangerror: invalid status code: 0

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

然后,我将获得所有订阅那种 post 的人。 (任何用户都可以对 post 的元数据进行过滤)

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

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

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.

时遇到问题

Unhandled rejection rangerror: invalid status code: 0

我在 Whosebug 上看到了以下未解决的问题:, , 3。 任何提示将不胜感激。

路线

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

经常让我摆脱困境的是更小的、可测试的、有希望的 returning 单元。以第一个函数为例,将其设为模型函数,让controller管理reqres。让它只做模型工作,return 直接来自数据库的承诺。

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

关键是将它们创建为小的 promise-returning 单元。建立一些测试个人的路线。您可以在控制器中链接模型单元,并将 req 和 res 的操作留给控制器。

发现路由中的问题: 而不是

.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

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