【问题标题】:Unable to join 2 tables with a foreign key using sequelize无法使用 sequelize 使用外键连接 2 个表
【发布时间】:2018-02-26 02:23:37
【问题描述】:

我有两个使用 sequelize 创建的表。请查看以下型号。我有一个客户端发布请求,将数据从客户端发送到两个表。但是当我发布时,除了职业表中的外键为空外,所有内容都被存储了,所以我无法将它们连接在一起

用户模型

module.exports = function(sequelize, DataTypes){
        var User = sequelize.define('User', {
            first_name: {
                type: DataTypes.STRING,
                allowNull: false,
                validate: {
                  len: [1, 160]
                }
              },
              last_name: {
                type: DataTypes.STRING,
                allowNull: false,
                validate: {
                  len: [1, 160]
                }
              },
              email: { 
                type: DataTypes.STRING,
                allowNull: false,
                validate: {
                  len: [1,100],
                  isEmail: true
                }
              },
              password: {
                type: DataTypes.STRING,
                allowNull: false,
                validate: {
                    len: [1,20]
                }
              },
              gender: {
                type: DataTypes.STRING,
            },
            pet:{
                type: DataTypes.STRING,
                allowNull: true,
                validate:{
                    len:[1, 100]
                }
            }

    });
    // Association between user and professions, where one user can be linked to many professions.
    User.associate = function(models) {
      User.hasMany(models.Profession, {
        onDelete: "cascade",
        foreignKey : "UserId"
      });
    };
    return User;
    };

职业模型

module.exports = function(sequelize, DataTypes) {
    // Creates a table "profession" in our network database
      var Profession = sequelize.define("Profession", {
        // LIST OF COLUMNS //

        //Category is a string type, cannot be null, and validates for length
        category: {
          type: DataTypes.STRING,
          allowNull: false,
          validate: {
            len: [1, 160]
          }
        }
    });
   // Adds a foreign key to the user id from the "user" table to be associated with corresponding profession
   Profession.associate = function (models) {
    Profession.belongsTo(models.User, {
      // foreignKey: {
      //   allowNull: false
      // }
      foreignKey: "UserId"
    });
  };

    return Profession;
  };

另外,以下是我在运行服务器时遇到的错误

Unhandled rejection Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:489:11)
    at ServerResponse.setHeader (_http_outgoing.js:496:3)
    at ServerResponse.header (/Users/Veena/Desktop/Project2/tests/modalnavigation_test/node_modules/express/lib/response.js:767:10)
    at ServerResponse.send (/Users/Veena/Desktop/Project2/tests/modalnavigation_test/node_modules/express/lib/response.js:170:12)
    at ServerResponse.json (/Users/Veena/Desktop/Project2/tests/modalnavigation_test/node_modules/express/lib/response.js:267:15)
    at /Users/Veena/Desktop/Project2/tests/modalnavigation_test/routes/api-routes.js:54:11
    at tryCatcher (/Users/Veena/Desktop/Project2/tests/modalnavigation_test/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/Users/Veena/Desktop/Project2/tests/modalnavigation_test/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/Users/Veena/Desktop/Project2/tests/modalnavigation_test/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromise0 (/Users/Veena/Desktop/Project2/tests/modalnavigation_test/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/Users/Veena/Desktop/Project2/tests/modalnavigation_test/node_modules/bluebird/js/release/promise.js:693:18)
    at Async._drainQueue (/Users/Veena/Desktop/Project2/tests/modalnavigation_test/node_modules/bluebird/js/release/async.js:133:16)
    at Async._drainQueues (/Users/Veena/Desktop/Project2/tests/modalnavigation_test/node_modules/bluebird/js/release/async.js:143:10)
    at Immediate.Async.drainQueues (/Users/Veena/Desktop/Project2/tests/modalnavigation_test/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:785:20)
    at tryOnImmediate (timers.js:747:5)
    at processImmediate [as _immediateCallback] (timers.js:718:5)

客户端 jQuery 发送 post 请求

// submit button is triggered
$('#submitbutton').click(function(event){
    event.preventDefault();
    console.log('submit button is triggered');
    formSubmit();
})

    function formSubmit() {       
             var submitThisData = {
            // Grabbing the values of user data in an object called userData
            userData :{
                first_name: $('#firstname').val().trim(),
                last_name: $('#lastname').val().trim(),
                email: $('#email').val().trim(),
                password: $('#Password').val().trim(),
                gender: $('#gender').val().trim(),
                pet: $('#pet').val().trim(),
            },
            // Grabbing the values of profession data that will go into profession table in an object called userData
            professionData : {
                // UserId: 1,
                category: $("#category").val().trim()
        } 
        }


        // Ajax post request for creating a member in our database. 

        $.post("/api/members", submitThisData).then(function(result){
            alert('user stored');
            console.log(result);
        })


         }
      });

路由

// Dependencies
// =============================================================

// Requiring our User model
var db = require("../models");

// Routes
// =============================================================
module.exports = function(app) {


    // POST route for saving a User
  app.post("/api/members", function(req, res) {
    console.log(req.body);    

    db.User.create({
      first_name: req.body['userData[first_name]'],
      last_name: req.body['userData[last_name]'],
      email: req.body['userData[email]'],
      password: req.body['userData[password]'],
      gender: req.body['userData[gender]'],
      pet: req.body['userData[pet]']

    }).then(function(dbUser) {
      res.json(dbUser);
    });

    db.Profession.create({

      category: req.body['professionData[category]']

    }).then(function(dbProfession) {
      res.json(dbProfession);
    });

  });
};

【问题讨论】:

  • 能否也添加客户端代码?
  • 嘿,我添加了客户端代码和路由。

标签: mysql node.js inner-join sequelize.js


【解决方案1】:

您需要在您的create user 流程完成后保存职业数据。在then内保存职业。

module.exports = function (app) {
    // POST route for saving a User
    app.post("/api/members", function (req, res) {
        console.log(req.body);
        let tmpJson = {};

        db.User.create({
            first_name: req.body['userData[first_name]'],
            last_name: req.body['userData[last_name]'],
            email: req.body['userData[email]'],
            password: req.body['userData[password]'],
            gender: req.body['userData[gender]'],
            pet: req.body['userData[pet]']
        }).then(function (dbUser) {
            tmpJson.dbUser = dbUser;
            return db.Profession.create({
                category: req.body['professionData[category]']
            });
        }).then(function (professionData) {
            tmpJson.professionData = professionData;
            res.status(200).json({
                status: "success",
                reason: tmpJson
            });
        });
    });
};

您也可以使用以下方法来保存您的数据。

exports.createUserAndPrfession = function (req) {
    return models.user.create(
        {
            first_name: req.body['userData[first_name]'],
            last_name: req.body['userData[last_name]'],
            email: req.body['userData[email]'],
            password: req.body['userData[password]'],
            gender: req.body['userData[gender]'],
            pet: req.body['userData[pet]'],

            Profession: [{
                category: req.body['professionData[category]']
            }]
        }, {
            include: [Profession]
        });
}

【讨论】:

  • 谢谢。它让我以这种方式在两个表中保存数据。但由于某种原因,外键仍然返回为 null
猜你喜欢
  • 1970-01-01
  • 2015-07-04
  • 2022-08-02
  • 2012-03-29
  • 2023-03-20
  • 1970-01-01
  • 2017-05-22
  • 2020-11-25
  • 1970-01-01
相关资源
最近更新 更多