【问题标题】:API Error Handling and data validation in ExpressJSExpressJS 中的 API 错误处理和数据验证
【发布时间】:2019-07-15 17:24:33
【问题描述】:

我有一个用 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,数据成功插入db

如何避免处理上述问题并发送错误响应,例如 Age should be Integer

谢谢。

【问题讨论】:

    标签: node.js rest express


    【解决方案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);
    });
    

    【讨论】:

      【解决方案2】:

      你可以只使用sequelize模型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;
      };

      【讨论】:

        猜你喜欢
        • 2020-11-18
        • 2020-08-23
        • 2019-04-10
        • 2022-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        相关资源
        最近更新 更多