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

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

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

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1093閲覧

React JSX「TypeError: x.map is not a function」エラー

hiro_ike

総合スコア48

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/06/20 01:54

編集2021/06/20 10:52

Javascript/React 学習中です。

index.jsxファイルのmapの行で下記エラーとなります。
「TypeError: pokemon.map is not a function」

ググって複数見てみましたが、初心者なためエラー原因が自分でわかりませんでした。
ご指摘または、確認すべき場所をアドバイス頂けますと幸いです。

index.jsxファイル

React

1const React = require('react') 2 3const myStyle = { 4color: '#ffffff', 5backgroundColor: '#000000', 6}; 7const cap = { 8 textTransform: 'capitalize', 9 color: 'silver', 10} 11 12class Index extends React.Component { 13 render(){ 14 const pokemon = this.props.Pokemon; 15 return ( 16 <div style={myStyle}> 17 <h1>See All The Pokemon!</h1> 18 <ul> 19 { 20 pokemon.map((Pokemon, i)=>{ 21 return( 22 <li style={cap}> 23 <a href={`/pokemon/${i}`}><font color="silver">{`${i}`} {pokemon.name}</font></a> 24 </li> 25 ) 26 }) 27 } 28 </ul> 29 </div> 30 ) 31 } 32} 33 34module.exports = Index;

server.jsファイル

JavaScript

1require('dotenv').config() 2 3const express = require('express'); 4const app = express(); 5const PORT = 3000; 6const Pokemon = require('./models/pokemon'); 7 8 9const mongoose = require('mongoose'); 10mongoose.connect(process.env.MONGO_URI, { 11 useNewUrlParser: true, 12 useUnifiedTopology: true, 13 useCreateIndex: true, 14 useFindAndModify: false 15}) 16mongoose.connection.once('open', () => { 17 console.log('connected to mongo') 18}) 19 20app.set('view engine', 'jsx'); 21app.engine('jsx', require('express-react-views').createEngine()) 22//追記 23app.use(express.urlencoded({ extended: true })) 24 25app.get('/', (req, res) => { 26 res.send('Welcome to the Pokemon App!') 27}) 28 29/* 30Indexにも追記 31*/ 32app.get('/pokemon', (req, res) => { 33 Pokemon.find({}, (err, foundPokemon)=>{ 34 if(err){ 35 res.status(404).send({ 36 msg: err.message 37 }) 38 } else { 39 res.render('Index', { 40 Pokemon: foundPokemon 41 }) 42 } 43 }) 44 45}) 46 47/* 48*/ 49app.get('/pokemon/new', (req, res) => { 50 res.render('New') 51}) 52 53app.get('/pokemon/:id', (req, res) => { 54 res.render('Show', { 55 pokemon: pokemon[req.params.id] 56 }); 57}) 58 59/* 60追記 61*/ 62app.post('/pokemon', (req, res) =>{ 63 Pokemon.create(req.body, (err, createdPokemon ) => { 64 if(err){ 65 res.status(404).send({ 66 msg: err.message 67 }) 68 } else { 69 console.log(createdPokemon); 70 res.redirect('/pokemon') 71 } 72}) 73}) 74 75app.listen(PORT, () => { 76 console.log('We in the building', PORT) 77})

pokemon.js ファイル

JavaScript

1const { Schema, model } = require('mongoose'); 2const pokemonSchema = new Schema({ 3 name: { type: String, required: true, unique: true }, 4 img: { type: String, required: true }, 5 6}); 7const Pokemon = model('Pokemon', pokemonSchema); 8module.exports = Pokemon;

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

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

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

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

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

maisumakun

2021/06/20 01:59

カテゴリに「MongoDB」も追加しておいたほうがいいかと思います。
guest

回答1

0

ベストアンサー

index.jsxで表示したい this.props.Pokemon にデータが入っていないからではないでしょうか。

貼り付けられたソースを拝見したところ、pokemon.jsに定義したMongooseのModelでデータを取得してJSXに渡そうとしていますが、server.jsではModelをそのまま渡しているだけでデータ取得の関数を呼び出していないです。
MongoDBにクエリを発行していないことになるため、this.props.Pokemonにデータが入らず表記のエラーが発生するのではないでしょうか。

Mongooseのドキュメントの以下の部分を参考にModelからMongoDBにクエリを発行してみてください。
https://mongoosejs.com/docs/api.html#model_Model.find

// async-awaitスタイルで取得 await MyModel.find({}); // callbackスタイルで条件指定して取得 MyModel.find({ name: 'john', age: { $gte: 18 }}, function (err, docs) {...});

投稿2021/06/20 04:09

Ponzmild

総合スコア21

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

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

hiro_ike

2021/06/20 08:47

ご回答ありがとうございます。 新規追加しようとすると、下記エラーが帰ってきます。 "msg": "Pokemon validation failed: img: Path `img` is required., name: Path `name` is required." mongoDBから直接クエリを追加しましたが、それも表示されませんでした。。 サンプルコードを見て追記してみましたが、誤りなどありましたらご指摘いただけますと幸いです。
hiro_ike

2021/06/20 10:57

app.useの行を追加して、新規登録までできました! 回答、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問