【问题标题】:How does Sequelize destroy function work?Sequelize destroy 函数是如何工作的?
【发布时间】:2020-06-30 06:07:00
【问题描述】:

我一直在尝试使用 Sequelize ORM 删除 MySql 数据库中的用户,但它没有删除。

  1. 没有偏执,这里是查询生成:
UPDATE `Users` SET `active`=?,`updatedAt`=? WHERE `id` = ?
  1. 将 paranoid 设置为 true,生成的查询如下:
 UPDATE `Users` SET `active`=?,`updatedAt`=? WHERE (`deletedAt` IS NULL AND `id` = ?)

在互联网上挖掘我发现查询应该采用这种形式UPDATE "posts" SET "deletedAt"=[timestamp] WHERE "deletedAt" IS NULL AND "id" = 1 accounding to this Documentation

这是我的模型:

'use strict';
const sequelizePaginate = require('sequelize-paginate')
const bcrypt = require('bcrypt')
module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    photo: DataTypes.STRING,
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
    email: DataTypes.STRING,
    phone: DataTypes.STRING,
    password: DataTypes.STRING,
    role: DataTypes.STRING,
    verifyEmailAt: DataTypes.DATE,
    referralCode: DataTypes.STRING,
    active: DataTypes.BOOLEAN,
    referrer: DataTypes.STRING,
    rememberToken: DataTypes.STRING
    
  }, { instanceMethods: {
    comparePasswords: (password, prevPassword,callback) => {
      bcrypt.compare(password, prevPassword, (error, isMatch) => {
          if(error) {
              return callback(error);
          }
  
          return callback(null, isMatch);
      });
  }
},
hooks: {
    beforeValidate: (user) => {
      if(user.changed('password')) {
          return bcrypt.hash(user.password, 10).then(function(password) {
              user.password = password;
          });
      }
  }
}});
  User.associate = (models) => {
    // associations can be defined here
    models.User.hasMany(models.Booking)
    models.User.hasMany(models.DriversLocation)
    models.User.hasMany(models.DriverReview)
    models.User.hasMany(models.Payment)
  };
  sequelizePaginate.paginate(User)
  return User;
};

还有我的查询 sn-p:

const { validationResult } = require('express-validator')
const models = require('../models')

deleteAdmin: (req, res) => {
            const result = validationResult(req);
            if (!result.isEmpty()) {
                return res.status(422).json({ success: false, message: 'input validation failure',
                code: 422, properties:{ userId : req.params.userId}, error: result.array()  });
            
            }
            models.User.destroy({
                where: {
                  id: req.params.userId
                }
              })
            .then((data) => {
                return res.status(200).json({ success: true, message: "success",
                code: 200, properties:{params: {userId: req.params.userId }}, 
                data: {content: data}});
            }).catch((error) => {
                return res.status(520).json({ success: false, message: "unknown error",
                code: 520, properties:{params: {userId: req.params.userId }}, 
                data: { error: error}  });
            })
        }

这里有什么问题吗?

提前感谢您的帮助

【问题讨论】:

    标签: node.js express sequelize.js


    【解决方案1】:

    destroy 的使用对我来说似乎很好。请验证您的 User 模型导入和 req params 值。

    此外,架构定义中没有定义 id 字段。 id是如何保存在数据库记录中的?

    【讨论】:

    • 这里的userId指的是sequelize自动生成的id
    • 再一次,destroy 方法正在引用活动列(布尔类型),从生成的查询中可以看出,而 deletedAt 列是由 sequelize 自动生成的 datetime 类型
    • 我曾使用过 sequalize & Mysql,当paranoid 未设置时,此方法会生成 DELETE 查询。但是,如果您设置了 paranoid,那么它作为 soft-delete 工作,并且只更新 deletedAt(或您选择的任何名称)字段的时间戳。
    • 你能在不设置paranoid字段的情况下测试一个新模型吗?
    • 经过几天的挖掘,我终于看到了错误。在我的路线文件中,我错误地调用了:router.get('/admin/deleteAdmin/:userId', param('userId').notEmpty().isNumeric(), AdminManager.deactivateAdmin) 而不是router.get('/admin/deleteAdmin/:userId', param('userId').notEmpty().isNumeric(), AdminManager.deleteAdmin)。这就是问题所在。我想我在工作了几个小时后真的筋疲力尽了,而那个错误却被忽视了,这带来了如此多的痛苦。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多