代码之家  ›  专栏  ›  技术社区  ›  Catfish

快递承诺链如何发送响应和结束承诺链流?

  •  0
  • Catfish  · 技术社区  · 7 年前

    Unhandled rejection Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client 如果 result === null .

    'use strict'
    
    const HttpStatus = require('http-status-codes')
    const { handleErr } = require('ciitizen-express-helpers').utils
    
    function updateOrganization(db, stats) {
      return function (req, res) {
        db.organization.findOne({
          where: {
            id: req.params.id
          }
        })
          .then(result => {
    
            if (result === null) {
              return res.status(HttpStatus.NOT_FOUND).send() <-- IF RESULT IS NULL, I RETURN THIS 
            }
    
            console.log('original result = ', result)
    
            // Update any fields that were passed in
            if (req.body.name) {
              result.name = req.body.name
            }
    
            if (req.body.address1) {
              result.address1 = req.body.address1
            }
    
            if (req.body.address2) {
              result.address2 = req.body.address2
            }
    
            if (req.body.city) {
              result.city = req.body.city
            }
    
            if (req.body.state) {
              result.state = req.body.state
            }
    
            if (req.body.zip) {
              result.zip = req.body.zip
            }
    
            console.log('new result = ', result)
            return result.save()
          })
          .then(result => {
            console.log('final result = ', result)
            return res.status(HttpStatus.CREATED).send(result) <-- BUT IT'S STILL TRYING TO CALL THIS, HENCE THE CAN'T SEND HEADERS ERROR
          })
          .catch(err => {
            req.log.error(err)
            return handleErr(res, HttpStatus.INTERNAL_SERVER_ERROR, err.message)
          })
      }
    }
    
    module.exports = updateOrganization
    

    在不继续我的承诺链流程的情况下,提前返回响应的最佳方式是什么?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Jaromanda X    7 年前

    像那样的承诺

    (A) return null 之后 res.status(HttpStatus.NOT_FOUND) return

    B) 在 then(result 检查结果是否为空,如果为空,则跳过 res.status(... 代码

    'use strict'
    
    const HttpStatus = require('http-status-codes')
    const { handleErr } = require('ciitizen-express-helpers').utils
    
    function updateOrganization(db, stats) {
      return function (req, res) {
        db.organization.findOne({
          where: {
            id: req.params.id
          }
        })
          .then(result => {
    
            if (result === null) {
              // change A
              res.status(HttpStatus.NOT_FOUND).send();
              return null;
            }
            // snip
            return result.save()
          })
          .then(result => {
            console.log('final result = ', result)
            // change B
            if (result !== null) {
                return res.status(HttpStatus.CREATED).send(result)
            }
          })
          .catch(err => {
            req.log.error(err)
            return handleErr(res, HttpStatus.INTERNAL_SERVER_ERROR, err.message)
          })
      }
    }
    
    module.exports = updateOrganization
    

    或者,将现有代码保留到

          .then(result => {
            // change C
            if (!res.headersSent) {
                console.log('final result = ', result)
                return res.status(HttpStatus.CREATED).send(result)
            }
          })
    

    老实说,这可能是一个“更干净”的解决办法

        2
  •  0
  •   mdev    7 年前

    测试这一点:

        function updateOrganization(db, stats) {
      return function (req, res) {
        db.organization.findOne({
          where: {
            id: req.params.id
          }
        })
          .then(result => {
    
            if (!result) {
              res.status(HttpStatus.NOT_FOUND).end();
              return null;
            }
    
            console.log('original result = ', result)
    
            // Update any fields that were passed in
            if (req.body.name) {
              result.name = req.body.name
            }
    
            if (req.body.address1) {
              result.address1 = req.body.address1
            }
    
            if (req.body.address2) {
              result.address2 = req.body.address2
            }
    
            if (req.body.city) {
              result.city = req.body.city;
            }
    
            if (req.body.state) {
              result.state = req.body.state;
            }
    
            if (req.body.zip) {
              result.zip = req.body.zip;
            }
    
            console.log('new result = ', result);
            return result.save();
          })
          .then(result => {
            console.log('final result = ', result);
            if(result) {
                return res.status(HttpStatus.CREATED).json(result)
            }
            return null;
    
          })
          .catch(err => {
            req.log.error(err);
            return handleErr(res, HttpStatus.INTERNAL_SERVER_ERROR, err.message);
          })
      }
    }
    
    推荐文章