简体   繁体   English

如何使用 express 从后端获取自定义错误消息?

[英]How to get custom error message from the backend using express?

I'm trying to build a Login App.我正在尝试构建一个登录应用程序。 So basically I want custom error message on the Front End like -: When I want to register from the email which is already in use and when I enter the password whose length is less than 6.所以基本上我想在前端自定义错误消息,例如 -:当我想从已经在使用的 email 注册并且输入长度小于 6 的密码时。

So I've configured the app.js file of the express backend to return json object on error.所以我已经配置了 express 后端的 app.js 文件以返回 json object 错误。

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;

Now the index.js file of the router where I've created the Errors:-现在是我创建错误的路由器的 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;

**But when I try to login or register with Password less than length of 6 then the the response that I get on the browser is the error without any Custom error text or something. **但是当我尝试使用长度小于 6 的密码登录或注册时,我在浏览器上得到的响应是没有任何自定义错误文本或其他内容的错误。

在记录响应时我得到这个而不是自定义错误(在登录页面上输入错误的密码)

I've tried response.data.{params} but still the backend dosen't pass anything until the res.status is 201.** (i don't want to use express-validator)我已经尝试过 response.data.{params} 但在 res.status 为 201 之前后端仍然没有传递任何东西。**(我不想使用 express-validator)

FrontEnd Code for Login:-登录的前端代码:-

    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 );
                    }
                )
        }

From the backend catch your error and send it从后端捕获您的错误并将其发送

catch (err) {
return res.status(500).send("Category name should be unique");
}

Get it in catch block in front end through response sent from HTTP request通过从 HTTP 请求发送的响应在前端的 catch 块中获取它

 catch((err) => {
    if (err.response.status === 500) console.log(err.response.data);
  });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM