【问题标题】:Why sequelize insert twice?为什么续集插入两次?
【发布时间】:2020-01-11 06:13:40
【问题描述】:

我尝试将数据插入数据库,但是当调用de端点时,数据被插入了两次。

我尝试使用async await,在函数外调用model,使用promise,问题没有解决。

插入:

exports.create = (req, res) => {
  let User = require('./models').User;

  User.create({
    id: 0,
    name: 'Jon',
    age: 21,
    email: 'test@gameil.com',
    city: 1
  })
  .then(result => {
    res.send(result);
  })
  .catch(error => {
    res.status(500).send(error);
  })
}

型号索引:

'use strict';

const fs        = require('fs');
const path      = require('path');
const Sequelize = require('sequelize');
const basename  = path.basename(__filename);

//PRINCIPAL DATABASE CONFIG
const env = process.env.NODE_ENV || 'main';
const config = require(__dirname + '/../../configs/v1/config.json')[env];
const db = {};

if (config.use_env_variable) {
  var sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  var sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');//open .js file
  })
  .forEach(file => {
    var model = sequelize['import'](path.join(__dirname, file));//connect data base using file model
    db[model.name] = model;//model.name example (const model = require(./model).modelName;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

型号:

module.exports = function (sequelize, DataTypes) {
    let Users= sequelize.define('Users', {
        id: {
            type: DataTypes.INTEGER(11),
            allowNull: false,
            primaryKey: true
        },
        name: {
            type: DataTypes.STRING(50),
            allowNull: false
        },
        age:{
            type: DataTypes.INTEGER(11),
            allowNull: false
        },
        email:{
            type: DataTypes.STRING(256),
            allowNull: false
        },
        city:{
            type: DataTypes.INTEGER(11),
            allowNull: false
        },
  }, {
    tableName: 'users',
    timestamps: true,
    paranoid: true
  });
  Users.associate = function (models) {
        Users.belongsTo(models.Cities, { foreignKey: 'city' });
  }
  return Users;
};

路线:

const controller = require('../controllers/userController');

module.exports = (router, opts, done)=>{
    router.post('/', controller.create);
    done();
}

应用程序:

const users = require('./routes/users');

app.register(users, { prefix: '/user' });

我需要那个查询只插入一个数据,而不是两次,有什么想法可以解决吗?

【问题讨论】:

  • 代码没问题,请检查您是否调用了两次 api/函数。
  • 请出示端点代码
  • 我调用了一次,然后进入测试,当我只是不调用 .create 函数执行一次,但是当 User.create 在那里时,函数执行了两次,但我不知道为什么。跨度>
  • @SebastianKaczmarek 我编辑了帖子,并添加了路由器和应用程序代码。
  • 奇怪,你试过用console.log()调试吗? controller.create 方法是否被调用了两次?

标签: mysql node.js sequelize.js fastify


【解决方案1】:

问题是:

addHook('prehandler', async(req, res, done)=>{
  done();//its wrong because use async/await
});

正确:

addHook('prehandler', async(req, res)=>{
  return
});

使用 async/await 或返回 Promise 时,done 回调不可用。如果您确实在这种情况下调用 done 回调,则可能会发生意外行为,例如处理程序的重复调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 2016-01-25
    相关资源
    最近更新 更多