現在Node.jsを用いた開発を行なっています。
sequelizeにおけるデータベース処理を行なっていて、
あるユーザーがあるアイテムを購入する処理を実現させたいと考えています。
UserモデルとItemモデルは多対多の関係とし、モデルの定義を
js
1// ~/prj/models/user.js 2 3'use strict'; 4const { 5 Model 6} = require('sequelize'); 7module.exports = (sequelize, DataTypes) => { 8 class User extends Model {}; 9 User.init({ 10 name: { 11 type:DataTypes.STRING, 12 validate: { 13 notEmpty: { 14 msg: "名前が入力されていません。" 15 } 16 } 17 }, 18 pass: { 19 type: DataTypes.STRING, 20 validate: { 21 notEmpty: { 22 msg: "パスワードが入力されていません。" 23 } 24 } 25 }, 26 item1: DataTypes.INTEGER, 27 item2: DataTypes.INTEGER, 28 item3: DataTypes.INTEGER, 29 item4: DataTypes.INTEGER, 30 item5: DataTypes.INTEGER, 31 item6: DataTypes.INTEGER, 32 item7: DataTypes.INTEGER, 33 item8: DataTypes.INTEGER, 34 item9: DataTypes.INTEGER, 35 item10: DataTypes.INTEGER, 36 money: DataTypes.INTEGER, 37 }, { 38 sequelize, 39 modelName: 'User', 40 }); 41 const UserItem = sequelize.define('UserItem', { 42 isSet: DataTypes.BOOLEAN 43 }); 44 User.associate = function(models) { 45 User.hasMany(models.Board, { foreignKey: 'userId' }); 46 User.belongsToMany(models.Item, { through: UserItem}); 47 }; 48 return User; 49};
js
1// ~/prj/models/item.js 2 3'use strict'; 4const { 5 Model 6} = require('sequelize'); 7module.exports = (sequelize, DataTypes) => { 8 class Item extends Model {}; 9 Item.init({ 10 part: DataTypes.STRING, 11 item_name: DataTypes.STRING, 12 price: DataTypes.INTEGER, 13 selling_price: DataTypes.INTEGER, 14 attack: DataTypes.INTEGER, 15 defence: DataTypes.INTEGER, 16 speed: DataTypes.INTEGER, 17 skill: DataTypes.INTEGER, 18 hp: DataTypes.INTEGER, 19 file_name: DataTypes.STRING 20 }, { 21 sequelize, 22 modelName: 'Item', 23 }); 24 Item.associate = function(models) { 25 Item.belongsToMany(models.User, { 26 through: 'UserItem' 27 }); 28 }; 29 return Item; 30};
としています。ここでルーティングファイルにて
js
1// ~/prj/routes/buy.js 2 3const express = require('express'); 4const router = express.Router(); 5const db = require('../models/index'); 6const { Op } = require("sequelize"); 7 8// --略-- 9 10db.UserItem.create({ 11 UserId: req.session.login.id, 12 ItemId: req.params.item_id, 13 isSet: false, 14 createdAt: new Date(), 15 updatedAt: new Date() 16 }); 17 18// --略-- 19
上記のように中間テーブル(junction table)へデータのcreateを行おうとしたところ
(node:65016) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'create' of undefined at ~/prj/routes/buy.js:145:25 at processTicksAndRejections (internal/process/task_queues.js:95:5)
というエラーが出てしまいました。またdbの定義については
js
1// ~/prj/models/index.js 2 3'use strict'; 4 5const fs = require('fs'); 6const path = require('path'); 7const Sequelize = require('sequelize'); 8const basename = path.basename(__filename); 9const env = process.env.NODE_ENV || 'development'; 10const config = require(__dirname + '/../config/config.json')[env]; 11const db = {}; 12 13let sequelize; 14if (config.use_env_variable) { 15 sequelize = new Sequelize(process.env[config.use_env_variable], config); 16} else { 17 sequelize = new Sequelize(config.database, config.username, config.password, config); 18} 19 20fs 21 .readdirSync(__dirname) 22 .filter(file => { 23 return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); 24 }) 25 .forEach(file => { 26 const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); 27 db[model.name] = model; 28 }); 29 30Object.keys(db).forEach(modelName => { 31 if (db[modelName].associate) { 32 db[modelName].associate(db); 33 } 34}); 35 36db.sequelize = sequelize; 37db.Sequelize = Sequelize; 38 39module.exports = db; 40
こちらにて行なっています。
db.Userやdb.Itemへのアクセスはできていましたが、中間テーブルについては調べても文献が少なく、解決の糸口が見えないため、アドバイスをいただけますと幸いです。
何卒よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー