2017-07-15 61 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

相关问题