【问题标题】:How to get custom error message from the backend using express?如何使用 express 从后端获取自定义错误消息?
【发布时间】:2021-08-28 05:13:22
【问题描述】:

我正在尝试构建一个登录应用程序。 所以基本上我想在前端自定义错误消息,例如 -:当我想从已经在使用的电子邮件中注册并且输入长度小于 6 的密码时。

所以我已经将 express 后端的 app.js 文件配置为在出错时返回 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)

登录的前端代码:-

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

【问题讨论】:

  • 您的所有 console.logs 是否都输出了预期的结果?
  • 只有当我输入正确的密码时,我才能从控制台的后端获取所需的对象
  • 尝试更改 put 方法。我不相信您在正确登录时更新了任何用户?
  • @Jondreisbach 204 可能是由于cors
  • @degod 你可能想分享前端代码,以及它是如何从控制台调用/PUT 请求的……看来你正在使用axios?

标签: javascript node.js postgresql express


【解决方案1】:

从后端捕获您的错误并发送它

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

通过 HTTP 请求发送的响应在前端的 catch 块中获取它

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2018-03-01
    • 2015-12-07
    • 1970-01-01
    • 2021-07-29
    • 2013-08-17
    • 2021-11-18
    相关资源
    最近更新 更多