簡體   English   中英

當 NODE_ENV=production 時忽略錯誤處理程序

[英]Error handler ignored when NODE_ENV=production

我正在使用 Node/Express 構建一個簡單的 REST API,但在將其部署到生產環境時遇到了困難。 NODE_ENV=development ,一切都按預期進行。 我得到了 JSON 錯誤和正確的狀態代碼。 NODE_ENV=production ,我只返回一個帶有默認錯誤消息的 HTML 頁面,沒有別的。 我可以讀取狀態代碼,但我需要訪問完整的 JSON 負載才能更好地識別錯誤。 這是我的代碼:

import Promise from 'bluebird'; // eslint-disable-line no-unused-vars
import express from 'express';
import config from './config';
import routes from './routes';
import { errorMiddleware, notFoundMiddleware } from './middlewares/error.middleware';
import mongoose from './config/mongoose.config';

// create app
const app = express();

(async () => {
  // connect to mongoose
  await mongoose.connect();

  // pretty print on dev
  if (process.env.NODE_ENV !== 'production') {
    app.set('json spaces', 2);
  }

  // apply express middlewares
  app.use(express.json());

  // register v1 routes
  app.use('/v1', routes);

  // catch errors
  app.use(notFoundMiddleware);
  app.use(errorMiddleware);

  // start server
  app.listen(config.port, () => console.info(`server started on port ${config.port}`));
})();

export default app;

這是notFoundMiddleware

export default (req, res, next) => next(new Error('Not Found'));

這是errorMiddleware

const errorMiddleware = (err, req, res, next) => {
  console.log('test'); // this works in development, but not in production
  const error = {
    status: err.status,
    message: err.message
  };

  if (err.errors) {
    error.errors = err.errors;
  }

  if (process.env.NODE_ENV !== 'production' && err.stack) {
    error.stack = err.stack;
  }

  return res.status(error.status || 500).send({ error });
};

如果您在生產服務器上運行,請嘗試使用諸如“papertrailapp”之類的日志記錄提供程序來查看您的應用程序中發生的錯誤。

在此處輸入圖片說明

我剛剛偶然發現了同樣的問題。 原來它是由構建生產包時應用的轉譯器優化引起的 - 這個: https ://babeljs.io/docs/en/babel-plugin-minify-dead-code-elimination

Express 的錯誤處理程序應該有簽名(err, req, res, next) => { ... } (是 arity 4)。 在您的示例中next未在errorMiddleware函數體中的任何地方使用,因此它從生產代碼中的函數簽名中被消除(優化)。

解決方案

  • 使用keepFnArgs: true插件選項 - 可能通過https://webpack.js.org/plugins/babel-minify-webpack-plugin/ webpack 配置:

     var MinifyPlugin = require("babel-minify-webpack-plugin") module.exports = { // ... optimization: { minimizer: [ new MinifyPlugin({ deadcode: { keepFnArgs: true, }, }, {}), ], } // ... }
  • 或者在你的代碼或者假裝這種說法是用於:
     const errMiddleware = (err, req, res, _next) => { // ... your code ... // ... // cheat here: _next }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM