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

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

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

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

3回答

5013閲覧

Express(Node.js)の、app.paramでの値の渡し方を教えてくださいmm

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

1クリップ

投稿2016/10/04 04:50

編集2016/10/04 13:55

こんにちは。
Node.js(Express)の勉強を始めたばかりで、
疑問点があり、質問させてください。

app.paramで、オブジェクトで値を取得するには、
どのようにしたら良いでしょうか?

下記で動くと思ったのですが、
req.params.titleがundefinedになってしまいます。

node.js

1var express = require('express'), 2 app = express(); 3 4app.set('views', __dirname + '/template'); 5app.set('view engine', 'ejs'); 6 7app.param(['id','page'], function(req, res, next, value) { 8 var pagetitle = { 9 profile: 'プロフィール', 10 about: '概要' 11 }; 12 req.params.title = pagetitle.page; 13 next(); 14}); 15 16app.get('/:id/:page?', function(req, res) { 17 if(req.params.page) { 18 res.render('contents', {title: req.params.title}); 19 } 20 else { 21 res.send('no contents'); 22 } 23}); 24 25app.listen(3000); 26console.log('start'); 27

解決方法をご教示いただけますと幸いです。
どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

req.params.titleがundefinedになってしまいます。

以下のコードでは、pagetitle.pageが undefined なので、req.params.titleも undefined なのではないでしょうか。

javascript

1// pagetitle のオブジェクトには page プロパティはない? 2 var pagetitle = { 3 profile: 'プロフィール', 4 about: '概要' 5 }; 6 req.params.title = pagetitle.page;

追加でご質問いただいた件について、追記します。

http://localhost/fffff/profile/

の時に、req.params.titleに「プロフィール」という文字列が渡される
http://localhost/fffff/about/
の時に、req.params.titleに「概要」という文字列が渡される

ということをされたいとのことなので、

javascript

1app.param('page', function(req, res, next, value) { 2 var pagetitle = { 3 profile: 'プロフィール', 4 about: '概要' 5 }; 6 req.params.title = pagetitle[value]; 7 next(); 8});

ではないでしょうか? (すみません、未検証です。存在しない場合のエラー処理を省いてます)

投稿2016/10/04 15:45

編集2016/10/05 02:44
mit0223

総合スコア3401

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

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

退会済みユーザー

退会済みユーザー

2016/10/05 00:27

mit0223様 ご回答いただき、どうもありがとうございますmm app.paramで渡した引数、'page'は、req.params.pageである認識で、 このpageは、ディレクトリの文字列が入ってくると思っているのですが、 例:下記のURLの場合、 http://localhost/fffff/profile/ の時、req.params.idはfffff、req.params.pageはprofile app.paramの第一引数にidとpageで値が渡される この考え自体がまちがっているのでしょうか? また、どのようにしたら、値を取得できるでしょうか。。。
mit0223

2016/10/08 16:20

id と page の2つのパラメータがあるということで認識はあっていますが、 app.param の仕様は、第一引数に指定したパラメータに対して第二引数に渡したコールバックを呼び出すという仕様です。ここに配列を指定すると、kong さんの調査結果にあるように、id と param で2回呼び出されます。つまり、コールバックの value が 'ffff’ と 'profile' で2回呼び出されるわけです。 第一引数に 'page' を指定することで、 page のほうにだけ反応しできます。このとき value には、 'profile' や 'about' が渡されてくるので、私のコードのように記述すれば、対応する日本語名が取れると思います。 (日本語名が見つからなかったときに英語名を表示するとかの機能を追加したほうがいいかもしれません)
退会済みユーザー

退会済みユーザー

2016/11/21 23:42

mit0223様 申し訳ありません、追記していただいた部分を見落としていました。 どうもありがとうございました。
guest

0

認識は合っていると思いますが、mit0223さんも指摘されている、「pagetitle.page」が存在しないのが原因でしょう。

その上で、pageの値ごとにtitleにセットする値を変えたいのであれば、例えば以下になります。

app.param('page', function(req, res, next, value) { var pagetitle = { profile: 'プロフィール', about: '概要' }; if(value === 'profile') { req.params.title = pagetitle.profile; } else { req.params.title = pagetitle.about; } next(); });

投稿2016/10/05 02:02

kong

総合スコア181

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

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

退会済みユーザー

退会済みユーザー

2016/10/05 03:23

kong様 どうもありがとうございます。 諸々、こちらの理解が足りていなかったようです。 idの値も後ほど使うようにしたいので、 一旦、下記の様にしてみようと思います。 ```node.js app.param(['id','page'], function(req, res, next, value) { var pagetitle = { profile: 'プロフィール', about: '概要' }; req.params.title = pageId[req.params.page]; next(); }); ``` 上記で、タイトルが渡せました。 もっとスマートに書く形があるのだと思いますので、もう少し勉強してみます。 どうもありがとうございましたmm
退会済みユーザー

退会済みユーザー

2016/10/05 03:25

すみません、上記、 req.params.title = pageId[req.params.page]; は、 req.params.title = pagetitle[req.params.page]; の誤りです。 失礼しました。
guest

0

実際に動かして見たのですが、
app.paramにconsole.logを入れて見ると分かります。

app.param(['id','page'], function(req, res, next, value) { console.log(value); //valueにはURLの中の条件に一致した部分の値が入る var pagetitle = { profile: 'プロフィール', about: '概要' }; req.params.title = pagetitle.page; next(); });

この処理は、URLが条件に一致した回数だけ通り、URLの中の条件に一致した部分の値が入るようです。

例えば、リクエストURLが「http://localhost:3000/hello/world」の場合、今回は

app.get('/:id/:page?', function(req, res) {

とあるので、valueには1回目は"hello"、2回目は"world"が入ります。

その上で、以下の部分ですが、

req.params.title = pagetitle.page;

この部分はどういう処理を行おうとしているのでしょうか?

投稿2016/10/05 01:27

kong

総合スコア181

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

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

退会済みユーザー

退会済みユーザー

2016/10/05 01:38

kong様 ご回答どうもありがとうございますmm 実現したいことは、pageの部分のURLが変わった時に、 対応するページのタイトルの文字列を渡し、 EJSでタイトルの文字列を表示する、ということです。 例: http://localhost/fffff/profile/ の時に、req.params.titleに「プロフィール」という文字列が渡される http://localhost/fffff/about/ の時に、req.params.titleに「概要」という文字列が渡される こちらにつきましては、 res.render('contents', {title: req.params.title}); 上記で、contents.ejsにtitleのタグを埋め込んでおり、 req.params.titleの値がその部分に表示される、ということで 実現できると思っているのですが上手く値が渡せません。 mit0223様へもご返信させていただいたのですが、 例:下記のURLの場合、 http://localhost/fffff/profile/ の時、req.params.idはfffff、req.params.pageはprofile app.paramの第一引数にidとpageで値が渡される という認識でおります。 そして、その値を、req.params.titleに渡し、 app.renderでcontents.ejsで表示されるようにしたいと思っております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問