node.js - Kraken JS 中间件和异常

标签 node.js express 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 错误

首先,让我们回顾一下通常如何在普通的旧式 Express 应用程序中注册 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...'); });

routes are resolved in the order they're added in Express 4 ,只要您的 404 处理程序是最后一个,您就可以确定没有其他路由匹配。

此模式在 Express FAQs 中有简要描述。 .

<小时/>

处理 500 秒

现在让我们进入 500 秒。

Express 具有错误处理中间件的概念(也在 Express site 中进行了描述)。错误处理中间件需要 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 时才会执行,例如下一步(新错误('oops'))

继续运行它。如果您访问 /notFound 或任何随机路线,您将正确地得到 404。如果您访问 /firstRoute,您将得到 found me,如果您访问 secondRoute,您将得到 Broken。 :(.

<小时/>

海妖怎么样?

Kraken——或更准确地说,meddleware —只需将中间件的定义移至配置中即可。您上面复制的那一小段 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 ...

关于node.js - Kraken JS 中间件和异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27668935/

相关文章:

javascript - 在 NodeJS 中从 MP4 中提取 RGB 帧数据

node.js - 如何从其他 Node js文件调用函数

node.js - MongoError : Mod on _id not allowed

node.js - Node JS : How to set template engine in krakenjs

node.js - 为什么 Node.js/Express 不接受来自本地主机的连接?

javascript - nvm 在哪里存储 node.js 安装?

node.js - 在 Node 应用程序上触发许多请求进行测试,导致套接字挂起/ECONNRESET 错误

sockets - 使用 socket.io 授权

angularjs - Krakenjs 如何将除某些 api 调用之外的所有请求路由到index.html?

node.js - 在 KrakenJS/Express 中加载 socket.io 作为模块