gpt4 book ai didi

node.js - Sequelize 数据类型未经过验证

转载 作者:太空宇宙 更新时间:2023-11-03 23:05:17 27 4
gpt4 key购买 nike

我最近一直在学习 Node.JS,目前正在使用 Sequelize。我的更新方法有问题;它更新得很好,但是当我输入与属性的数据类型不兼容的值时,它仍然会传递它,并在数据库中更新它。

例如:在 Postman 中,当我尝试使用字符串更新记录的“已完成”属性时,即使数据类型被指定为 bool 值,它也会更新,并且不会传递任何错误消息(请求状态为 200)。这是代码:

  • 待办事项模型:

    module.exports = function (sequelInst, DataTypes){
    return sequelInst.define('todo', {
    description: {
    type: DataTypes.STRING,
    allowNull: false,
    validate: {
    len: [1, 250]
    }
    },
    completed: {
    type: DataTypes.BOOLEAN,
    allowNull: false,
    defaultValue: false
    }
    });
    };
  • 服务器.js:

        ...

    app.put('/todos/:id', function(req,res){
    var body =_.pick(req.body, 'description', 'completed');
    var attributes = {};
    var paramId = parseInt(req.params.id, 10);

    if( body.hasOwnProperty('completed')){
    attributes.completed = body.completed;
    }

    if( body.hasOwnProperty('description')) {
    attributes.description = body.description;
    }

    db.todo.findById(paramId)
    .then(function(todo){ // First Promise Chain
    if(todo){
    return todo.update(attributes);
    }
    else{
    res.status(404).send("No todo corresponding to id");
    }
    }, function () {
    res.status(500).send("Server Error");
    })
    .then(function(todo) { // Second Promise Chain
    res.send(todo);
    }, function (e){
    res.status(400).json(e);
    });

    });

最佳答案

Instance.update不根据类型进行验证。

由于您没有收到错误,因此您可能使用 SQLite 或其他存储,它们在数据库级别的类型也没有严格的验证。

您需要添加自己的验证器。如果你这样做:

completed: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false,
validate: {
isBoolean: true
}
}

您将收到以下错误:

Unhandled rejection SequelizeValidationError: Validation error: Validation isBoolean failed

但是,此验证似乎已被弃用:

validator *deprecated* you tried to validate a boolean but this library (validator.js) validates strings only. Please update your code as this will be an error soon. node_modules/sequelize/lib/instance-validator.js:276:33

这会起作用:

var _ = require('lodash');

validate: {
isBoolean: function (val) {
if (!_.isBoolean(val)) {
throw new Error('Not boolean.');
}
}
}

会给你一个错误:

Unhandled rejection SequelizeValidationError: Validation error: Not boolean.

关于node.js - Sequelize 数据类型未经过验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36069722/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com