gpt4 book ai didi

mysql - 无法使用sequelize连接带有外键的2个表

转载 作者:行者123 更新时间:2023-11-29 10:22:29 24 4
gpt4 key购买 nike

我有两个使用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);
});

});
};

最佳答案

创建用户流程完成后,您需要保存职业数据。将职业保存在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]
});
}

关于mysql - 无法使用sequelize连接带有外键的2个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48980616/

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