Kraken JS промежуточное ПО и исключения
Я экспериментирую с KrakenJS, пытаюсь создать базовый API для понимания вещей.
Одна вещь, в которой я не уверен, это промежуточное ПО, в частности, обработка ошибок 404/500.
"fileNotFound": {
"enabled": true,
"priority": 130,
"module": {
"name":"path:./lib/exceptions/404"
}
}
Это ловит любые 404 ошибки, и затем я сам справляюсь с этим в моей собственной конфигурации. Однако почему это fileNotFound
бросили? Где serverError
выброшено за 500 ошибок?
Я хотел бы определить свои собственные файлы для других исключений, таких как 403, однако как я могу получить это для запуска промежуточного программного обеспечения?
1 ответ
Как упомянул @HeadCode, обязательно прочитайте на meddleware, чтобы понять, как промежуточное ПО загружается немного лучше.
Тем не менее, мы должны пересмотреть несколько вещей, чтобы прояснить происходящее.
Погрузка 404
Во-первых, давайте рассмотрим, как обычно регистрировать обработчик 404 в простом старом экспресс-приложении.
Как правило, в цепочке продолжения промежуточного программного обеспечения будет конечное промежуточное ПО, просто предположите, что, если бы мы сделали это так долго, не выполняя поручение, мы просто не смогли бы найти ресурс. Вот пример:
var express = require('express');
var app = express();
app.get('/firstRoute', function handler(req, res) { res.send('found me'); });
app.get('/secondRoute', function handler(req, res) { res.send('found me'); });
app.use(function notFoundHandler(req, res, next) {
res.status(404).send('Route Not Found');
});
app.listen(8000, function onListen() { console.log('listening on 8000...'); });
Поскольку маршруты разрешаются в порядке их добавления в Express 4, пока ваш обработчик 404 последний, вы можете быть уверены, что ни один другой маршрут не соответствует.
Этот шаблон кратко описан в Экспресс-ответах.
Обработка 500 с
Теперь перейдем к 500-м годам.
В Express есть концепция промежуточного программного обеспечения для обработки ошибок (также описанного на сайте Express). Промежуточное программное обеспечение для обработки ошибок требует арности 4 (т.е. принимает четыре аргумента), и это единственное отличие. Они выполняются только в том случае, если сообщается об ошибке, которая выполняется путем передачи объекта в ваш next
вызов. Проще объяснить в коде:
var express = require('express');
var app = express();
app.get('/firstRoute', function handler(req, res) { res.send('found me'); });
app.get('/secondRoute', function handler(req, res) { throw new Error('oops'); });
app.use(function notFoundHandler(req, res, next) {
res.status(404).send('Route Not Found');
});
app.use(function errorHandler(err, req, res, next) {
res.status(500).send('Broken. :(');
});
app.listen(8000, function onListen() { console.log('listening on 8000...'); });
В приведенном выше примере errorHandler
будет выполняться, только если 1) другое промежуточное ПО или обработчик маршрута выдает ошибку или 2) мы вызываем next с аргументом *, .eg next(new Error('oops'))
,
Давай, беги. если вы посетите /notFound
или любой случайный маршрут, вы правильно получите 404. Если вы посетите /firstRoute
ты получишь found me
и если вы идете в secondRoute
ты получишь Broken. :(
,
Что насчет кракена?
Kraken - или, точнее, meddleware - просто перемещает определение вашего промежуточного ПО в вашу конфигурацию. Этот небольшой блок json, который вы скопировали выше, в основном функционально эквивалентен следующему в ванильном экспресс-приложении:
var fileNotFound = require('./lib/exceptions/404');
// ... app.use() everything with a priority lower than 130 ...
app.use(fileNotFound());
// ... app.use() everything with a priority *greater* than 130 ...