0

I try to insert a data into databased, but when de endpoint was called, the data was inserted twice.

I try to use async await, call model outside the function, use promise, and the problem not resolved.

Insert:

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);
  })
}

Model index:

'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);
  }
});

Model:

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;
};

Route:

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

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

app:

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

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

I need that query insert just one data, not twice, any idea to resolve?

1 Answers1

2

The problem is the:

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

Correct:

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

The done callback is not available when using async/await or returning a Promise. If you do invoke a done callback in this situation unexpected behavior may occur, e.g. duplicate invocation of handlers.