表示未捕获中间件中的例外



我正在尝试使用中间件来捕获路线中的异常。

预期结果:

当错误在路线上丢弃时,我希望它会被中间件捕获,以便我记录错误并返回通用响应。

实际结果:

当在路线上丢弃错误时,中间件永远不会达到。将错误和堆栈打印到控制台,浏览器显示Internal Server Error。除了投掷:

> NODE_ENV=production node api/server.js
Listening on port 8080!
Error: Error in /invite route
    at app.get (/Users/bughunter/Projects/ooberoo/lander/api/server.js:42:8)
    at Layer.handle [as handle_request] (/Users/bughunter/Projects/ooberoo/lander/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/bughunter/Projects/ooberoo/lander/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/Users/bughunter/Projects/ooberoo/lander/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/Users/bughunter/Projects/ooberoo/lander/node_modules/express/lib/router/layer.js:95:5)
    at /Users/bughunter/Projects/ooberoo/lander/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/Users/bughunter/Projects/ooberoo/lander/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/bughunter/Projects/ooberoo/lander/node_modules/express/lib/router/index.js:275:10)
    at Layer.handle [as handle_request] (/Users/bughunter/Projects/ooberoo/lander/node_modules/express/lib/router/layer.js:91:12)

应用程序是从NPM start脚本运行的:

"start": "NODE_ENV=production node api/server.js",

我的代码如下:

const express = require('express');
const path = require('path');
const winston = require('winston');
require('winston-daily-rotate-file');
// Are we production or development?
const env = process.env.NODE_ENV || 'development';
// Express
const app = express();
// Logger
const logger = new (winston.Logger)({
  transports: [ 
    new (winston.transports.DailyRotateFile)({
      filename: path.resolve(__dirname, '../logs/app.log'),
      datePattern: 'yyyy-MM-dd.',
      prepend: true,
      level: process.env.ENV === 'development' ? 'debug' : 'info'
    })
   ]
});
// Static files
app.use(express.static(path.resolve(__dirname, 'static')));
// Generic error middleware
app.use(function(error, req, res, next) {
  logger.log('error', error);
  res.status(500);
  res.setHeader('Content-Type', 'application/json');
  res.json({ error: 'Failed to process request' });
});
// Homepage
app.get('/', (req, res) =>
  res.sendFile(path.resolve(__dirname, './static/index.html'))
);
// Invite signup
app.get('/invite', (req, res, next) => {
  next(new Error('Error in /invite route'));
});
// Redirect to home if no route found
app.get('*', (req, res) =>
  res.redirect('/')
);
app.listen(8080, () =>
  console.log('Listening on port 8080!')
);

我正在做文档中所说的事情,但它似乎行不通。这里有任何建议吗?

错误中间件必须在最后一个其他中间件和路由之后声明:

app.get('/', (req, res) => ...
app.get('/invite', (req, res, next) => ...
app.get('*', (req, res) => ...
app.use((error, req, res, next) => { ... // <= declare error middleware here

最新更新