Не работает обработчик ошибок

В приложении на express.js не работает middleware для обработки ошибок.

package.json:

{
  "name": "platform",
  "version": "1.0.0",
  "scripts": {
    "start:dev": "node src/index.js",
    "start:prod": "node src/index.js",
    "migrate": "npx sequelize-cli db:migrate"
  },
  "dependencies": {
    "bcrypt": "^5.0.1",
    "cookie-parser": "^1.4.6",
    "cors": "^2.8.5",
    "dotenv": "^10.0.0",
    "express": "^4.17.1",
    "fs": "^0.0.1-security",
    "jsonwebtoken": "^8.5.1",
    "mysql2": "^2.3.3",
    "nodemon": "^2.0.15",
    "path": "^0.12.7",
    "sequelize": "^6.12.0-beta.1",
    "sequelize-cli": "^6.3.0",
    "uuid": "^8.3.2"
  }
}

index.js:

const express = require('express');
const cors = require('cors');
const cookieParser = require('cookie-parser');


const app = express();

app.use(cookieParser());
app.use(express.json());
app.use(cors());
app.use(express.urlencoded({ extended: true }));

app.use('/api/user/registration', async (req, res, next) => {
    try {
        throw new Error();
    } catch (e) {
        next(e);
    }
})

//error handler
app.use((err, req, res) => {
    res.status(500).json({ message: 'Custom error' });
});


(async function start() {
    try {
        app.listen(3010, () => console.log(`Server listen: 3010`))
    } catch (e) {
        console.log(e);
    }
})();

При попытке отправить POST-запрос на localhost:3010/api/user/registration, в консоль логируется ошибка:

Error
    at \platform\src\index.js:15:15
    at Layer.handle [as handle_request] (\platform\node_modules\express\lib\router\layer.js:95:5)
    at next (\platform\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (\platform\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (\platform\node_modules\express\lib\router\layer.js:95:5)
    at node_modules\express\lib\router\index.js:281:22
    at Function.process_params (\platform\node_modules\express\lib\router\index.js:335:12)       
    at next (\platform\node_modules\express\lib\router\index.js:275:10)
    at \platform\node_modules\body-parser\lib\read.js:130:5
    at invokeCallback (\platform\node_modules\raw-body\index.js:224:16)

В чём может быть проблема?


Ответы (2 шт):

Автор решения: DiD

Проблема в том, что именно вы посылаете запросом POST, в каком формате и в какой кодировке

app.use(express.json());

у JSON очень привередливый синтаксис. В случае первого же символа, не вписывающегося в синтаксис JSON, прога будет выдавать исключения.

→ Ссылка
Автор решения: Alexey Ten

В документации на чистом английском написано чтобы обработчика ошибок должно быть 4 аргумента. Иначе как экспресс должен его отличить от обычной мидлвари?

→ Ссылка