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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

データベース

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

Q&A

解決済

2回答

1160閲覧

Next.js×Sequelize のdbがundefined

gasuketu

総合スコア10

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

データベース

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

0グッド

0クリップ

投稿2021/04/17 14:31

編集2021/04/17 23:04

Next.js のapiをaxiosで叩き、データベース内のデータを取得しようとしたところ  Cannot read property 'findByPk' of undefined エラーが発生。

javaScript

1//pages/api/user.js 2const db = require('../../db/models/'); 3 4export default (req,res) =>{ 5 db.User.findByPk(1) //ここでエラー発生 6 .then(usr=>{ 7 res.status(200).json({usr}); 8 }) 9}

javascript

1//pages/index.js 2import axios from 'axios'; 3import React,{useEffect,useState} from 'react'; 4 5const Home = () => { 6 const [data,setData] = useState(''); 7 8 useEffect(()=>{ 9 axios.get('/api/user') 10 .then(usr=>{ 11 setData(usr.name); 12 }) 13 }) 14return( 15 <div> 16 <p>Hello</p> 17 <p>{data}</p> 18 </div> 19) 20} 21 22export default Home; 23

javascript

1//models/index 2'use strict'; 3 4const fs = require('fs'); 5const path = require('path'); 6const Sequelize = require('sequelize'); 7const basename = path.basename(__filename); 8const env = process.env.NODE_ENV || 'development'; 9const config = require(__dirname + '/../config/config.json')[env]; 10const db = {}; 11 12let sequelize; 13if (config.use_env_variable) { 14 sequelize = new Sequelize(process.env[config.use_env_variable], config); 15} else { 16 sequelize = new Sequelize(config.database, config.username, config.password, config); 17} 18 19fs 20 .readdirSync(__dirname) 21 .filter(file => { 22 return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); 23 }) 24 .forEach(file => { 25 const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); 26 db[model.name] = model; 27 }); 28 29Object.keys(db).forEach(modelName => { 30 if (db[modelName].associate) { 31 db[modelName].associate(db); 32 } 33}); 34 35db.sequelize = sequelize; 36db.Sequelize = Sequelize; 37 38module.exports = db;

json

1//package.json 2{ 3 "name": "nextsequelize", 4 "version": "0.1.0", 5 "private": true, 6 "scripts": { 7 "dev": "next dev", 8 "build": "next build", 9 "start": "next start" 10 }, 11 "dependencies": { 12 "axios": "^0.21.1", 13 "next": "10.1.3", 14 "react": "17.0.2", 15 "react-dom": "17.0.2", 16 "sequelize": "^6.6.2", 17 "sequelize-cli": "^6.2.0", 18 "sqlite3": "^5.0.2" 19 } 20}

<エラー文>
TypeError: Cannot read property 'findByPk' of undefined
at module.exports../pages/api/user.js.webpack_exports.default (C:\Users\name\Desktop\nextsequelize.next\server\pages\api\user.js:187:11)
at apiResolver (C:\Users\name\Desktop\nextsequelize\node_modules\next\dist\next-server\server\api-utils.js:8:7)

<ファイル構成>
.next
node_modules
db
-config
-migrations
-seeders
-models
ーuser.js
ーindex.js
-db.sqlite3
page
public
styles
package.json
package-lock.json

<試したこと>
https://github.com/dyarfi/nextjs-sequelize
を参考にコードを書き換えてみたりしたが、解決できず。

よろしくお願いいたします。

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

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

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

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

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

seastar3

2021/04/17 16:07

Sequelizeを使ったことがないので、コーディングの形式だけでご確認しますが、 db.User.findByPk(1)のdb.Userの指定は合っていますか。 どこでSequelizeをインスタンス化しているのでしょうか。
gasuketu

2021/04/17 23:06 編集

models/index.jsです。models/indexのコード追加しました。db.Userの指定部分はあっていると思います。
guest

回答2

0

Sequelizeのバージョン5以降はfindByPkメソッドで、それ以前はfindByIdメソッドとのことです。
環境はバージョン6のようですが、一応findByIdメソッドで試してみてはどうでしょうか。

投稿2021/04/18 02:21

編集2021/04/18 02:22
seastar3

総合スコア2287

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

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

gasuketu

2021/04/18 07:06

上記の変更で解決できました。 協力ありがとうございました。<(_ _)><(_ _)><(_ _)>
guest

0

自己解決

いくつかのサイトを参考にいろいろいじってみたところ解決しました。
<変更1>
データベースファイルをルートディレクトリに移動
<変更2>
models/index.js のコードを修正

javascript

1//models/index.js 2'use strict'; 3 4const fs = require('fs'); 5const path = require('path'); 6const Sequelize = require('sequelize'); 7const basename = path.basename(__filename); 8const env = process.env.NODE_ENV || 'development'; 9const config = require(__dirname + '/../config/config.json')[env]; 10const db = {}; 11const models = process.cwd() + '/db/models/' || __dirname; //変更 12let sequelize; 13if (config.use_env_variable) { 14 sequelize = new Sequelize(process.env[config.use_env_variable], config); 15} else { 16 sequelize = new Sequelize(config.database, config.username, config.password, config); 17} 18 19fs 20 .readdirSync(models) //変更 21 .filter(file => { 22 return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); 23 }) 24 .forEach(file => { 25 // const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); 26 const model = require(`./${file}`).default(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

解決理由はまだわかっていないのでこれから調べていきます。

投稿2021/04/18 07:03

gasuketu

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問