
Как быстро начать работу с 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/awaitExpress с 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!