Передача сообщений об ошибках от экспресс-служб - PullRequest
1 голос
/ 10 июня 2019

В моем приложении узла у меня есть следующий код.

import gravatar from 'gravatar';
import bcrypt from 'bcryptjs';
import config from 'config';
import jwt from 'jsonwebtoken';

import { User } from '../models/user';

class AuthService {
  /** Register user */
  async registerUser(userDto) {
    const { firstName, lastName, email, password } = userDto;

    let user = await User.findOne({ email });
    if (user) throw new Error('Email already exists');

    const avatar = this.createAvatar(email);

    user = new User({ firstName, lastName, email, password, avatar });
    user.password = await this.hashPassword(user.password);
    await user.save();

    const token = this.generateAuthToken(user);
    return { user, token }
  }

При наличии дублированного электронного письма почтальон выдает правильное сообщение об ошибке, но оно выглядит следующим образом.

<code><!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Error</title>
    </head>
    <body>
        <pre>Error: Email already exists
            <br> &nbsp; &nbsp;at AuthService._callee$ (/home/shashika/PROJECTS/developer-connector/server/services/authService.js:14:21)
            <br> &nbsp; &nbsp;at tryCatch (/home/shashika/PROJECTS/developer-connector/server/node_modules/regenerator-runtime/runtime.js:65:40)
            <br> &nbsp; &nbsp;at Generator.invoke [as _invoke] (/home/shashika/PROJECTS/developer-connector/server/node_modules/regenerator-runtime/runtime.js:303:22)
            <br> &nbsp; &nbsp;at Generator.prototype.&lt;computed&gt; [as next] (/home/shashika/PROJECTS/developer-connector/server/node_modules/regenerator-runtime/runtime.js:117:21)
            <br> &nbsp; &nbsp;at step (/home/shashika/PROJECTS/developer-connector/server/services/authService.js:30:191)
            <br> &nbsp; &nbsp;at /home/shashika/PROJECTS/developer-connector/server/services/authService.js:30:361
            <br> &nbsp; &nbsp;at processTicksAndRejections (internal/process/task_queues.js:89:5)
        

Я хочу только сообщение об ошибке.Но почему это дает мне этот HTML-код?

Ответы [ 3 ]

1 голос
/ 10 июня 2019

Вы можете создать глобальное промежуточное программное обеспечение для обработки ошибок.Это просто пример кода, как это может работать.Просто поместите это промежуточное ПО как последнее промежуточное ПО в ваш index.js (app.js?).

errorMiddleware.js

export default (err, req, res, next) => {
    console.log('Server err', err.message);

    return res.status(err.status || 500).json({
        error: err.message
    });
};

app.js

import errors from './middleware/errorMiddleware';
...
// your middlewares
...
app.use(errors);

Itэто просто базовый пример, вы можете настроить его так, как вам нужно (отправлять err.message только в среде разработчика или обрабатывать ошибки в зависимости от типа ошибки или состояния и т. д.).Также хорошо использовать подход try / catch и обрабатывать ошибки с помощью метода express next ().

0 голосов
/ 10 июня 2019

Ошибка выдается только внутри сервера.Что вы должны сделать, это создать ответ с соответствующим кодом ошибки HTTP и отправить его обратно клиенту.Предполагая, что вы поймаете ошибку выше где-то еще, ваш код должен выглядеть примерно так.Если вы не показываете нам, где и как вы звоните registerUser.

async function user_register(req, res)
{
    try
    {
        await registerUser(param);
    }
    catch(error)
    {
        //'Email already exists' will be caught here
        // you might have multiple erors thrown here so you can use if else statements
        res.status(500); // your error code here. choose whatever you think is appropriate. you can use 'http-status-codes'
        res.json({
            message : error.message
        });
    }
}
0 голосов
/ 10 июня 2019

Это исходит от экспресс / узла.Это исключение и не должно предоставляться клиенту.Вы должны поймать ошибку и ответить своими собственными деталями ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...