Kraken JS中间件和异常



我正在试验KrakenJS,试图建立一个基本的API来理解事物。

我不确定的一件事是中间件,特别是 404/500 错误处理。

"fileNotFound": {
    "enabled": true,
    "priority": 130,
    "module": {
            "name":"path:./lib/exceptions/404"
    }
}

这会捕获任何 404 错误,然后我在自己的配置中自己处理。但是,为什么抛出这个fileNotFound?500 个错误在哪里抛出serverError

我想为其他异常(如 403)定义自己的文件,但是我如何让它触发中间件?

正如@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 站点上也有描述)。错误处理中间件需要 arity 为 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) 我们接下来调用一个参数*时才会执行,.e.g. next(new Error('oops')) .

如果您访问/notFound或任何随机路线,您将正确获得 404。如果你去/firstRoute你会得到found me,如果你去secondRoute你会得到Broken. :(


海妖呢?

Kraken——或者更准确地说,干预软件——只是将定义中间件移动到你的配置中。您在上面复制的那一小块 json 在功能上基本上等同于原版 Express 应用程序中的以下内容:

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 ...

最新更新