質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2571閲覧

Node.js, sequelizeにおいて中間テーブル(junction table)にアクセスできない

velonica74

総合スコア11

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/07/05 11:29

編集2021/07/06 15:52

現在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へのアクセスはできていましたが、中間テーブルについては調べても文献が少なく、解決の糸口が見えないため、アドバイスをいただけますと幸いです。
何卒よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi-sun

2021/07/06 02:53 編集

エラー文は読みましたか? まぁ、読んで汲み取るにはコツが必要なので解説します。 > TypeError: Cannot read property 'create' of undefined この部分が重要です。 それ以外はスタックトレースというファイル名やメソッドの発火順序等の住所のようなものなので 必要に応じて読み飛ばしましょう。 JSはオブジェクト指向言語なので 値の後に`.property_name`という風にドットを打てばそのオブジェクトのプロパティにアクセス出来ます。 しかし例外中の例外が2つあり、nullとundefined値のみプロパティを所持していません。 またこの例外の値はプロパティの参照を試みた瞬間TypeErrorでスクリプトが強制終了する仕様になっています。 この前提を元にエラー文を読むと、 「undefined値に対してcreateプロパティをアクセスしようとしてるけど、それJavaScriptではエラーだよ」という和訳になります。 そして該当のコードを探した所これでしょうね。 > db.UserItem.create(opt); db.UserItemというプロパティが存在しないのでundefinedになっており、 そのdb自体は`const db = require('../models/index');` 回答者が読めない箇所に原因が存在します。 案外TypoでUserItemがUserItomになっているとかじゃないですか? 確認してみて、間違いなく合っていた……というなら追記してみてください。
velonica74

2021/07/06 15:54

ご回答、並びにエラーに対する補足をしていただき誠にありがとうございます。 タイポについては自分で確認してみた所ないと思われます。 ../models/index の内容を追記致しましたので、お時間ある際にお力添えいただけますと幸いです。 何卒よろしくお願い申し上げます。
guest

回答1

0

ベストアンサー

/prj/models/user.jsにてUserItemの定義がなされているようですが、これが/prj/models/index.jsでdbのプロパティーに入らないからでしょう。
sequelizeは触ったことがないのでどうするのが良いのかはわかりませんが、UserItemの定義をファイルに切り出すか、別でdbに入れるようにする必要があります。

投稿2021/07/14 08:12

ka2obushi

総合スコア173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

velonica74

2021/07/14 17:50

ご回答ありがとうございます。 associationのthroughの設定のみでテーブルが作成されるため何か方法があるのかな、と思いましたが… 定義をファイルに切り出す形で進めたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問