Как получить пользовательское сообщение об ошибке из серверной части, используя express? - PullRequest
1 голос
/ 06 августа 2020

Я пытаюсь создать приложение для входа в систему. Так что в основном мне нужно настраиваемое сообщение об ошибке на Front End, например -: Когда я хочу зарегистрироваться с электронной почты, которая уже используется, и когда я ввожу пароль, длина которого меньше 6.

Итак, я настроил файл app. js серверной части express для возврата объекта json при ошибке.

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var cors = require('cors');
var helmet = require('helmet');
var compression = require('compression');
var rateLimit = require('express-rate-limit');
var { body, check } = require('express-validator');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(cors());
app.use(compression())
app.use(helmet())

app.use('/', indexRouter);
app.use('/users', usersRouter);

//Security
const limiter = rateLimit({
  windowMs: 1 * 60 * 1000, // 1 minute
  max: 5, // 5 requests,
});

app.use(limiter);

app.use(function () {
  res.setHeader("Pragma", "no-cache");
  res.setHeader("Expires", "0");
});



// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var error = new Error('404 Page Not Found');
  error.status = 404;
  next(error);
});

// error handler
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.json({
    message: err.message,
    error: req.app.get('env') === 'development' ? err : {}
  });
});

module.exports = app;

Теперь index. js файл маршрутизатора, на котором я создал ошибки: -

var express = require('express');
var router = express.Router();
var jwt = require('jsonwebtoken');
const { Pool, Client } = require('pg');

var port = process.env.USER || 3000;

var pool = require('../db');

/* GET home page. */
router.get('/', function (req, res) {
  res.render('index', { title: 'Welcome to the Server of Imager' });
});

//Registering User

function validateUser(user) {
  const validEmail = typeof user.email == 'string' &&
                     user.email.trim() != '';
  const validPassword = typeof user.password == 'string' &&
                    user.password.trim() != '' &&
                    user.password.trim().length >= 6;
  return validEmail && validPassword;
}

router.post('/register', async (req, res) => {
  console.log('Register Pushed');
  var newUser = {name: req.body.name, dob: req.body.dob, email: req.body.email, password: req.body.password};
  if (validateUser(newUser)) {
    console.log('User has valid Credentials');
    try {
      await pool.query(
        'INSERT INTO auth (name, dob, email, password) VALUES ($1, $2, $3, crypt($4, gen_salt(\'bf\')))',
        [newUser.name, newUser.dob, newUser.email, newUser.password]
      )
      console.log('Login Created by ' + newUser.name);
      res.status(201).json({message: 'Login Created by ' + newUser.name});
    } catch (e) {
        res.status(409).json({error: 'Duplicate Credentials is Already Present in the Database'});
        console.log('Duplicate Credential(s) present in Database');
    }
  }
  else {
    console.log('Invalid Email Or Password');
    res.status(500).json({error: 'Invalid Email or Password'});
  }
  res.end();
});


// Loggin In the User

router.post('/login', async (req, res) => {
  var user = {email: req.body.email, password: req.body.password};
  if (validateUser(user)) {
    results = await pool.query(
      'SELECT * FROM auth WHERE email = ($1) AND password = crypt(($2), password)',
      [user.email, user.password],
    )
    console.log(results.rows[0]);
    if (results.rows.length >= 1) {
      res.status(201).json({greeting: results.rows[0].name});
    } else {
      res.status(401).json({error: 'User Not Found'});
    }
  }

  else {
    res.status(500).json({error: 'Invalid Credentials'});
  }
  // res.end();
}
);

module.exports = router;

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

при ответе на вход я получаю это вместо пользовательской ошибки (при вводе неправильного пароля на странице входа в систему)

Я пробовал response.data. {Params}, но бэкэнд все равно ничего не передает, пока res.status не станет 201. ** (я не хочу использовать express -validator)

FrontEnd Code для входа в систему: -

    goHome() {
                this.$router.push( {
                    path: '/home'
                } );
            },
            goRegister() {
                this.$router.push( {
                    path: '/register'
                } );
            },
            login() {
                this.axios.post( 'http://localhost:3000/login', {
                        email: this.email,
                        password: this.password
                    } )
                    .then(
                        ( response ) => {
                            alert( response.data.greeting );
                            console.log( response );
                            this.goHome();
                            // response.data.message
                            return response.body;
                        },
                        ( response ) => {
                            console.log( response );
                            return response.body;
                            // alert( 'User Not Found' );
                        }
                    )
                // .then( data => {
                //  console.log( data );
                // } )
            }


>Register Front End Part


goLogin() {
            this.$router.push( {
                path: '/',
            } );
        },
        register() {
            this.axios.post( 'http://localhost:3000/register', {
                    name: this.name,
                    dob: this.dob,
                    email: this.email,
                    password: this.password
                } )
                .then(
                    response => {
                        console.log( response );
                        this.goLogin();
                    },
                    response => {
                        console.log( response.body );
                        console.log( response.header );
                        console.log( response );
                    }
                )
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...