Как быстро начать работу с VUE3.0:
Промежуточное программное обеспечение для обработки ошибок Learn Express может помочь вам обрабатывать ошибки, не повторяя одну и ту же работу. Предполагая, что вы обрабатываете ошибки непосредственно в обработчике маршрута Express:
app.put('/user/:id', async (req, res) => { пусть пользователь пытаться { пользователь = ждут User.findOneAndUpdate({ _id: req.params.id }, req.body) } поймать (ошибиться) { return res.status(err.status || 500).json({ message: err.message }) } вернуть res.json({пользователь}) })
Приведенный выше код работает нормально, однако, если интерфейсов сотни, то логика обработки ошибок становится неработоспособной, поскольку она повторяется сотни раз.
Express делится на различные типы в зависимости от количества параметров, которые принимает функция промежуточного программного обеспечения. Функция промежуточного программного обеспечения, принимающая 4 параметра, определяется как промежуточное программное обеспечение для обработки ошибок и будет вызываться только при возникновении ошибки.
const app = require('express')() app.get('*', функция RouteHandler() { // Это промежуточное программное обеспечение выдает ошибку, и Express перейдет непосредственно к следующему обработчику ошибок throw new Error('Oops!') }) app.get('*', (req, res, next) => { // Это промежуточное программное обеспечение не является обработчиком ошибок (только 3 параметра), Express пропустит его, поскольку в предыдущем промежуточном программном обеспечении есть ошибка console.log('Это не будет напечатано') }) // Ваша функция должна принимать 4 параметра, чтобы Express мог рассматривать ее как промежуточное программное обеспечение для обработки ошибок. app.use((err, req, res, next) => { res.status(500).json({сообщение: err.message }) })
Express автоматически обработает за вас ошибки синхронизации, такие как метод routeHandler()
выше. Но Express не обрабатывает асинхронные ошибки. Если возникает асинхронная ошибка, необходимо вызвать next()
.
const app = require('express')() app.get('*', (req, res, next) => { // Метод next() сообщает Express, что нужно перейти к следующему промежуточному программному обеспечению в цепочке. // Express не обрабатывает асинхронные ошибки, поэтому вам нужно сообщать об ошибках, вызывая next(). setImmediate(() => { следующий (новая ошибка («Упс»)) }) }) app.use((err, req, res, next) => { res.status(500).json({ сообщение: err.message }) })
Помните, что промежуточное ПО Express выполняется последовательно. Обработчики ошибок следует определять в последнюю очередь, после всего остального промежуточного программного обеспечения. В противном случае ваш обработчик ошибок не будет вызван:
async/await
Express с async/await не может перехватывать исключения из promise
, Express был написан до ES6, и не существует хорошего решения, как обрабатывать выдаваемые им async/await
.
Например, следующий сервер никогда не отправляет HTTP-ответ успешно, поскольку reject
от обещания никогда не обрабатывается:
const app = require('express')() app.get('*', (req, res, next) => { // Отчет об асинхронных ошибках должен передаваться через next() вернуть новое обещание((разрешить, отклонить) => { setImmediate(() => отклонить(новая ошибка('упс'))) }).catch(следующий) }) app.use((ошибка, требование, разрешение, следующий) => { console.log('не будет печатать') res.json({сообщение: error.message }) })Мы можем инкапсулировать
app.listen(3000)
или использовать для захвата существующую библиотеку.
Во-первых, мы просто инкапсулируем функцию для соединения async/await
с промежуточным программным обеспечением экспресс-обработки ошибок.
ПРИМЕЧАНИЕ . Асинхронные функции возвращают Promise, поэтому вам необходимо обязательно
catch()
любые ошибки и передавать их вnext()
.
функция WrapAsync(fn) { функция возврата (требование, разрешение, следующий) { fn(req, res, следующий).catch(следующий) } } app.get('*', WrapAsync(async (req, res) => { дождитесь нового обещания (resolve => setTimeout(() =>solve(), 50)) // Асинхронная ошибка! выдать новую ошибку («упс») }))
Используйте стороннюю библиотеку express-async-errors
, простой хак поддержки async/await ES6:
require('express-async-errors') app.get('*', async (req, res, next) => { дождитесь нового обещания((resolve) => setTimeout(() =>solve(), 50)) выдать новую ошибку («упс») })
промежуточное программное обеспечение обработки ошибок Express позволяет обрабатывать ошибки таким образом, чтобы максимизировать разделение задач. Вам не нужно обрабатывать ошибки в вашей бизнес-логике, даже не try/catch
при использовании async/await
. Эти ошибки появятся в вашем обработчике ошибок, который затем сможет решить, как ответить на запрос. Обязательно воспользуйтесь этой мощной функцией в своем следующем приложении Express!