2017-07-15 62 views
0

我有一個路由處理程序是這樣的:未處理的承諾拒絕:無法設置頭後,他們被送到

router.route('/callcenter/:callcenter_id/contactgroup/:contactgroup_id') 
    .delete((req, res) => { 
     if (typeof req.body.creator === 'undefined') { 
      return res.status(400).json({ 
       success: false, 
       error: { message: 'Invalid input' } 
      }); 
     } 
     const ContactGroup = new ContactGroupModel(db, req.params.callcenter_id, logger); 
     ContactGroup.read(req.params.contactgroup_id) 
      .then((result) => { 
       if (!result) { 
        return res.status(404).json({ 
         success: false, 
         error: { message: 'Contact group not found' } 
        }); 
       } 
       if (req.body.creator !== result.creator) { 
        return res.status(400).json({ 
         success: false, 
         error: { message: 'Invalid input' } 
        }); 
       } 
       return ContactGroup.delete(req.params.contactgroup_id); 
      }) 
      .then((result) => { 
       if (!result) { 
        return res.status(404).json({ 
         success: false, 
         error: { message: 'Contact group not found' } 
        }); 
       } 
       return res.json({ success: true }); 
      }) 
      .catch((error) => res.status(400).json({ 
       success: false, 
       error: { message: error } 
      })); 
    }); 

ContactGroup兩個readdelete功能的承諾。我寫幾個測試:

describe('DELETE',() => { 
      let id; 
      beforeEach(() => ContactGroup.create(data).then((result) => id = result._id)); 
      it('Should return 200 if successful', (done) => { 
       chai.request(app) 
        .delete('/callcenter/test/contactgroup/' + id) 
        .send({ creator: 'user__1' }) 
        .end((err, res) => { 
         expect(res.status).to.equal(200); 
         expect(res.body.success).to.equal(true); 
         return done(); 
        }); 
      }); 
      it('Should return 400 if input is invalid (without creator)', (done) => { 
       chai.request(app) 
        .delete('/callcenter/test/contactgroup/' + id) 
        .end((err, res) => { 
         expect(res.status).to.equal(400); 
         expect(res.body.success).to.equal(false); 
         expect(res.body.error.message).to.equal('Invalid input'); 
         return done(); 
        }); 
      }); 
      it('Should return 400 if input is invalid (unmatched creator)', (done) => { 
       chai.request(app) 
        .delete('/callcenter/test/contactgroup/' + id) 
        .send({ creator: 'user__2' }) 
        .end((err, res) => { 
         expect(res.status).to.equal(400); 
         expect(res.body.success).to.equal(false); 
         expect(res.body.error.message).to.equal('Invalid input'); 
         return done(); 
        }); 
      }); 
      it('Should return 404 if not found', (done) => { 
       ContactGroup.delete(id).then(
        () => { 
         chai.request(app) 
          .delete('/callcenter/test/contactgroup/' + id) 
          .send({ creator: 'user__1' }) 
          .end((err, res) => { 
           expect(res.status).to.equal(404); 
           expect(res.body.success).to.equal(false); 
           expect(res.body.error.message).to.equal('Contact group not found'); 
           return done(); 
          }); 
        }); 
      }); 
      afterEach(() => ContactGroup.delete(id)); 
     }); 

他們全部通過,但該記錄器記錄的最後兩項測試一些警告方含UnhandledPromiseRejectionWarning: Unhandled promise rejectionCan't set headers after they are sent

我沒有,爲什麼最終catch塊路由處理被調用。我認爲只有當承諾功能被拒絕,catch將發生

+0

在'res.json()'之前在catch塊中添加'return' –

回答

1

您的代碼嘗試發送多個響應爲同一請求,這就是爲什麼你會得到有關「頭已被髮送」的消息。

你有這樣的代碼:

ContactGroup.read(req.params.contactgroup_id).then(...).then(...).catch(...) 

而且,還有代碼路徑,你可以結束了在發送這兩個.then()處理這將導致該錯誤的響應。在你的第一個.then()處理程序,看來,你認爲這樣做的:

return res.status(404).json(...) 

停止許諾鏈。它不是。承諾鏈繼續並直接進入下一個.then()處理程序。由於res.status()不返回任何內容,因此它將轉至下一個.then()處理程序,undefined作爲已解決的值。這將導致你然後做:

return res.status(404).json(...) 

這會導致有關頭已被髮送的消息。


我不知道你想要的確切流量,但也許你想是這樣的,你窩在第二.then()所以它不會當你以前做的一個return執行:

router.route('/callcenter/:callcenter_id/contactgroup/:contactgroup_id').delete((req, res) => { 
    if (typeof req.body.creator === 'undefined') { 
     return res.status(400).json({ 
      success: false, 
      error: { 
       message: 'Invalid input' 
      } 
     }); 
    } 
    const ContactGroup = new ContactGroupModel(db, req.params.callcenter_id, logger); 
    ContactGroup.read(req.params.contactgroup_id).then((result) => { 
     if (!result) { 
      return res.status(404).json({ 
       success: false, 
       error: { 
        message: 'Contact group not found' 
       } 
      }); 
     } 
     if (req.body.creator !== result.creator) { 
      return res.status(400).json({ 
       success: false, 
       error: { 
        message: 'Invalid input' 
       } 
      }); 
     } 
     return ContactGroup.delete(req.params.contactgroup_id).then((result) => { 
      if (!result) { 
       return res.status(404).json({ 
        success: false, 
        error: { 
         message: 'Contact group not found' 
        } 
       }); 
      } 
      return res.json({ 
       success: true 
      }); 
     }); 
    }).catch((error) => res.status(400).json({ 
     success: false, 
     error: { 
      message: error 
     } 
    })); 
}); 
+0

非常感謝。這正是我想要的行爲 – necroface

相關問題