2017-08-22 32 views
0

我遇到了這個問題,我無法擺脫它。 我要做的是發佈「帖子」(json),將其保存到MongoDB中。未處理的拒絕範圍錯誤:無效的狀態碼:0

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時遇到問題。

Unhandled rejection rangerror: invalid status code: 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}))   
    }); 
+0

https://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it –

+0

所以我用了一個錯誤的承諾模式? @BenjaminGruenbaum – JackLametta

+1

避免['Promise' constructor antipattern](https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it)! – Bergi

回答

1

,往往讓我出了事小,可測試,承諾,返回單位的事情。以第一個功能爲例,將其作爲示範功能,讓控制器管理reqres。它只是做模型的工作,並且直接從db返回諾言。

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

1

研究發現,在路線的問題:

代替
.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

順便說一句,我會按照上面的提示。 謝謝大家!

相關問題