Экспресс / Мангуст / Jest ошибка: ECONNABORTED - PullRequest
0 голосов
/ 01 марта 2019

У меня есть встроенный API-интерфейс, который я тестирую с помощью Jest.API работает нормально, когда я тестирую с Postman, но когда я запускаю свой набор тестов, я обычно получаю сообщение об ошибке ECONNABORTED при загрузке файлов с использованием .attach ().(Иногда это работает просто отлично.) Я использую набор промежуточного программного обеспечения для загрузки массива изображений, на которые ссылается URL, после чего любые изображения передаются в конечную точку посредством загрузки формы.После того, как изображения сохранены, я использую третью часть промежуточного программного обеспечения, чтобы изменить размеры изображений и сохранить их в подкаталоге.Поскольку ошибка возникает только в Jest, похоже, что именно в этом и заключается ошибка, но я также не уверен, что правильно обрабатываю ошибки с помощью Multer.

// endpoint.js

const storage = multer.diskStorage({
  destination: async (req, file, cb) => {
    // Check for product's existence
    if (product) {
      // Make the directory if necessary
      cb(null, /* location */)
    } else {
      cb(404, null)
    }
  },
  filename: async (req, file, cb) => {
    cb(
      null, /* location */}`
    )
  }
})

const upload = multer({ storage }).array("files")

router.post(
  "/:id",
  async (req, res, next) => {
    // Download images from URLs if provided
    next()
  },
  (req, res, next) => {
    upload(req, res, err => {
      // Handle errors (e.g. return res.status(404).json({ message: "Product not found" })
    })
    next()
  },
  async (req, res) => {
    // resize and save to subdirectory
  }
)
// endpoint.test.js

describe("/endpoint", () => {
  describe("POST", () => {
    it("saves uploaded images to the server", async () => {
      const response = await request(app)
        .post(`/endpoint/${id}`)
        .attach("files", "assets/img-test-1.jpg")
        .attach("files", "assets/img-test-2.jpg")
        .set("Content-Type", "multipart/form-data")

      expect(response.status).toEqual(201)
    }, 30000)

  ...

})

РЕДАКТИРОВАТЬ: оригиналошибка была исправлена ​​путем перемещения вызова next() в обработчик Multer.Однако, теперь та же самая ошибка происходит, только в другом тесте.Опять же, ошибка возникает только при запуске тестовыми сценариями;У меня не было проблем при совершении идентичного звонка через почтальона.

// endpoint.js

let errors
router.post(
  "/:id",
  async (req, res, next) => {
    errors = []

    ...

    // This is the problematic call. If I explicitly set
    // product = null, the test runs normally
    const product = await Product.findById(req.params.id)
    if (!product) {
      errors.push({ status: 404, message: "Product not found" })
      return next()
    }

    ...

    return next()
  },
  // Several more middleware functions
})
// endpoint.test.js

...

beforeAll(done => {
  app.on("ready", async () => {
    const newProduct = await Product.create(product)
    id = newProduct._id
    done()
  })
})

...
describe("/api/bam/images", () => {
  describe("POST", () => {
    ...
    it("returns a 404 error if the associated product is not found", async () => {
      const response = await request(app)
        .post("/api/bam/images/000000000000000000000000")
        .attach("files", "assets/img-test-1.jpg")
        .attach("files", "assets/img-test-2.jpg")

      expect(response.status).toEqual(404)
    })
  })
})

1 Ответ

0 голосов
/ 01 марта 2019

Я думаю, что проблема может быть связана с вызовом next() до завершения загрузки multer - попробуйте перейти к следующему внутри обратного вызова загрузки:

(req, res, next) => {
    upload(req, res, err => {
      // Handle errors (e.g. return res.status(404).json({ message: "Product not found" 
      next()
      })
    })

  },

PT2: относится к редактированию, если кажется, чтопроблема связана с этим вызовом await, тогда может быть выброшена ошибка, которая не будет перехвачена - когда вы ожидаете отклоненного обещания, он ведет себя как обычный бросок.Бросок здесь означал бы, что next никогда не вызывается:

    // This is the problematic call. If I explicitly set
    // product = null, the test runs normally
    try {
      const product = await Product.findById(req.params.id)
      if (!product) {
        errors.push({ status: 404, message: "Product not found" })
        return next()
      }
    } catch (err) {
      return next(err)
    }

...