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

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

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

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

JavaScript

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

Express

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

Q&A

解決済

1回答

6318閲覧

Node.js+Express リダイレクト処理

kanetugu_70e

総合スコア100

Node.js

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

JavaScript

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

Express

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

0グッド

0クリップ

投稿2019/04/02 03:48

編集2019/04/05 02:58

実現したいこと

サーバーサイドjsから、別のサーバーサイドjsファイルへのリダイレクトを行いたいです。
具体的には、"index.js"⇒"users.js"です。

ファイル構成は以下の通りです。

/:(アプリルート)
|--app.js
|--routes
|  |--index.js
|  |--users.js
|  |
・  ・
・  ・

状況

以下については問題なく動作する事を確認済みです。(URLは"localhost:3000"省略)

  • URL"/users/add"等、他のルーティングは問題なくページ表示まで完了します。
  • 問題になっているindex.jsのリダイレクト処理res.redirect('/users'.....)の部分を、res.redirect('/users/test'.....)などにし、users.js側も"router.get('/test'.....)とすると、問題なくページ表示まで完了します。(ただ、app.jsで指定した"/users"でリダイレクト出来る様にしたいです。)
  • 以上から、app.js側のルーティングは問題ないと考えております。
  • また、相対パスでも試しましたが効果ありません。
  • ブラウザのキャッシュクリアもいずれの施策で実施しましたが効果ありません。

イメージ説明

javascript

1##app.js 2 3[抜粋] 4var index = require('./routes/index'); 5var users = require('./routes/users'); 6var home=require('./routes/home'); 78910app.use('/', index); 11app.use('/users', users); 12app.use('/home',home);

javascript

1##index.js 2 3var express = require('express'); 4var router = express.Router(); 5 6var mysql=require('mysql'); 7var knex=require('knex')({ 8 client:'mysql', 9 connection:{ 10 host:'localhost', 11 user:'root', 12 password:'root', 13 database:'nodeapp', 14 charset:'utf8' 15 } 16}); 17var Bookshelf=require('bookshelf')(knex); 18Bookshelf.plugin('pagination'); 19 20var User=Bookshelf.Model.extend({ 21 tableName:'users' 22}); 23var Message=Bookshelf.Model.extend({ 24 tableName:'messages', 25 hasTimestamps:true, 26 user:function(){ 27 return this.belongsTo(User); 28 } 29}); 30 31 32/* Redirect "users.js". -------------------------------------------------*/ 33router.get('/', (req, res,next)=>{ 34 if(req.session.login==null){ 35 res.redirect('/users'); 36 }else{ 37 res.redirect('/1'); 38 } 39}); 40 41router.get('/:page',(req,res,next)=>{ 42 if(req.session.login==null){ 43 res.redirect('/users'); 44 return; 45 } 46 var pg=req.params.page; 47 pg*=1; 48 if(pg<1){pg=1;} 49 new Message().orderBy('created_at','DESC') 50 .fetchPage({page:pg,pageSize:10,withRelated:['user']}) 51 .then((collection)=>{ 52 var data={ 53 title:'miniBoard', 54 login:req.session.login, 55 collection:collection.toArray(), 56 pagination:collection.pagination 57 }; 58 res.render('index',data); 59 }).catch((err)=>{ 60 res.status(500).json({error:true,data:{message:err.message}}); 61 }); 62}); 63 64router.post('/',(req,res,next)=>{ 65 var rec={ 66 message:req.body.msg, 67 user_id:req.session.login.id 68 }; 69 new Message(rec).save().then((model)=>{ 70 res.redirect('/'); 71 }); 72}); 73 74module.exports = router;

javascript

1##users.js 2 3var express=require('express'); 4var router=express.Router(); 5 6var mysql=require('mysql'); 7var knex=require('knex')({ 8 client:'mysql', 9 connection:{ 10 host:'localhost', 11 user:'root', 12 password:'root', 13 database:'nodeapp', 14 charset:'utf8' 15 } 16}); 17var Bookshelf=require('bookshelf')(knex); 18 19var User=Bookshelf.Model.extend({ 20 tableName:'users' 21}); 22 23router.get('/add',(req,res,next)=>{ 24 var data={ 25 title:'Users', 26 form:{name:'',password:'',comment:''}, 27 content:'登録する名前・パスワード・コメントを入力してください' 28 }; 29 res.render('users/add',data); 30}); 31 32router.post('/add',(req,res,next)=>{ 33 var request=req; 34 var response=res; 35 req.check('name','NAMEは必ず入力してください').notEmpty(); 36 req.check('password','PASSWORDは必ず入力してください').notEmpty(); 37 req.getValidationResult().then((result)=>{ 38 if(!result.isEmpty()){ 39 var content='<ul class="error">'; 40 var result_arr=result.array(); 41 for(var i in result_arr){ 42 content+='<li>'+result_arr[n].msg+'</li>'; 43 } 44 content+='</ul>'; 45 var data={ 46 title:'Users/Add', 47 content:content, 48 form:req.body 49 }; 50 response.render('/users/add',data); 51 }else{ 52 request.session.login=null; 53 new User(req.body).save().then((model)=>{ 54 response.redirect('/'); 55 }); 56 } 57 }); 58}); 59 60/*↓Redirect location-----------------------------------------------------------*/ 61router.get('/',(req,res,next)=>{ 62 var data={ 63 title:'Users/Login', 64 form:{name:'',password:''}, 65 content:'名前とパスワードを入力してください' 66 }; 67 res.render('users/login',data); 68}); 69 70router.post('/',(req,res,next)=>{ 71 var request=req; 72 var response=res; 73 req.check('name','nameは必ず入力してください').notEmpty(); 74 req.check('password','passwordは必ず入力してください').notEmpty(); 75 req.getValidationResult().then((result)=>{ 76 if(!result.isEmpty()){ 77 var content='<ul class="error">'; 78 var result_arr=result.array(); 79 for(var i in result_arr){ 80 content+='<li>'+result_arr[i].msg+'</li>'; 81 } 82 content+='</ul>'; 83 var data={ 84 title:'Users/Login', 85 content:content, 86 form:req.body 87 } 88 response.render('users/login',data); 89 }else{ 90 var nm=req.body.name; 91 var pw=req.body.password; 92 User.query({where:{name:nm},andWhere:{password:pw}}) 93 .fetch().then((model)=>{ 94 if(model==null){ 95 var data={ 96 title:'再入力', 97 content:'<p class="error">名前又はパスワードが違います</p>', 98 form:req.body 99 }; 100 response.render('users/login',data); 101 }else{ 102 request.session.login=model.attributes; 103 var data={ 104 title:'Users/login', 105 content:'<p>ログインしました</p>', 106 form:req.body 107 }; 108 response.render('users/login',data); 109 } 110 }); 111 } 112 }); 113}); 114 115module.exports=router;

json

1##package.json 2 3{ 4 "name": "mini-board2", 5 "version": "0.0.0", 6 "private": true, 7 "scripts": { 8 "start": "node ./bin/www" 9 }, 10 "dependencies": { 11 "bookshelf": "^0.14.2", 12 "cookie-parser": "~1.4.3", 13 "debug": "~2.6.9", 14 "ejs": "~2.5.7", 15 "express": "~4.16.0", 16 "express-session": "^1.15.6", 17 "express-validator": "^5.3.1", 18 "http-errors": "~1.6.2", 19 "knex": "^0.16.3", 20 "morgan": "~1.9.0", 21 "mysql": "^2.16.0" 22 } 23}

環境

  • VSCode
  • Node.js v10.15.2

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

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

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

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

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

guest

回答1

0

自己解決

原因は"index.js"の"router.get('/:page',~~)"の部分でした。
URLから"/"でアクセスすると、なぜか"/:page"のルートパスも実行対象となっていました。
get("/")側では特にnext()を書いているわけでも無いので、原因は不明です。
(そもそもなぜループになっているのかも不明です...)

結局、router.get('/page:page')としてルートパスの変更にて対応しました。

投稿2019/04/06 12:06

kanetugu_70e

総合スコア100

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問