ExpressJS中的API错误处理和数据验证

时间:2019-07-15 08:40:34

标签: node.js rest express

我有一个用ExpressJS构建的RestAPI。 POST 方法运行良好,并将数据保存到MySQL中。这是我的代码:

路由器(index.js)
var express = require('express');
var router = express.Router();
var cont = require('../controllers');

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

/* REGISTER */
router.post('/personal-info', cont.personalInfo.createNewUser);

module.exports = router;
控制器(PersonalInfo.js)
const PersonalInfo = require('../models').PersonalInfo;
const utils = require('../Utils/ResUtils');

module.exports = {
    createNewUser(req, res) {
        var name = req.body.name,
            age = req.body.age
            PersonalInfo.create({
                name : name,
                age : age,
                createdAt: new Date(),
                updatedAt: new Date()
            }).then(Personal_Info => {
                res.json({
                    'status': 'OK',
                    'messages': 'Personal Info Created',
                    'data': Personal_Info
                })
            }).catch( reason => utils.error(res, reason));
    }
}
模型(PersonalInfo.js)
'use strict';
module.exports = (sequelize, DataTypes) => {
  const PersonalInfo = sequelize.define('PersonalInfo', {
    name: DataTypes.STRING,
    age: DataTypes.INTEGER
  }, {
    tableName: "PersonalInfo",
    timestamp: false
  });
  PersonalInfo.associate = function(models) {
    // associations can be defined here
  };
  return PersonalInfo;
};

即使服务成功运行。我有问题,

  1. 即使属性age包含 varchar 数据,数据也已成功插入db。
  2. 即使属性name仅包含"",而属性集NOT_NULL = true
  3. ,数据也已成功插入db中

如何避免处理上述问题并发送错误响应,例如年龄应为整数

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以签出express-validator库,这对于输入验证非常有用,例如:

const { check, validationResult } = require('express-validator');

/* REGISTER */
app.post('/personal-info', [
    // Name should be at least 1 char long
    check('name').isLength({ min: 1 }),
    // Age should be an integer
    check('age').isInt()
  ], (req, res) => {
    // Finds the validation errors in this request and wraps them in an object with handy functions
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(422).json({ errors: errors.array() });
    }

    // Forward call onto createNewUser;
    cont.personalInfo.createNewUser(req, res);
});

答案 1 :(得分:0)

您可以仅使用续集模型validation

'use strict';
module.exports = (sequelize, DataTypes) => {
  const PersonalInfo = sequelize.define('PersonalInfo', {
    name: {
      type: DataTypes.STRING,
      validate: {
        is: ["^[a-z]+$",'i'] // will only allow letters
      }
    },
    age: {
      type: DataTypes.INTEGER,
      validate: {
        isInt: true // checks for valid integers
      }
    }
  }, {
    tableName: "PersonalInfo",
    timestamp: false
  });
  PersonalInfo.associate = function(models) {
    // associations can be defined here
  };
  return PersonalInfo;
};