##前提・実現したいこと
ドットインストールのExpressコース(2014年に更新終了・アーカイブ済)で、Node.jsのExpressフレームワークを用いたブログの作成をしています。
記事の更新・記事の削除を実装したいのですが、コースのやり方に従うと、
「Cannot POST /posts/0」「404 (Not Found)」というエラーが出てしまいます。
HTTPのフォームで更新・削除の情報を送る時に、POSTメソッドをhidden属性でput(更新)、delete(削除)メソッドに変える処理を行って実装しているのですが、うまくput,deleteととして認識されていないせいでエラーになっているのではないかと思い、解決方法を質問致します。
よろしくお願い致します。
##現在のファイル構成
bash
1├── app.js 2├── node_modules 3├── package-lock.json 4├── package.json 5├── routes 6│ └── post.js //全てのルーティング処理 7└── views 8 ├── partials 9 │ ├── footer.ejs 10 │ └── header.ejs 11 └── posts 12 ├── edit.ejs //編集ページ 13 ├── index.ejs //記事タイトル一覧ページ(編集・削除ボタン付き) 14 ├── new.ejs 15 └── show.ejs
##現在のコード
・app.js【メイン処理】
javascript
1const express = require('express'); 2const app = express(); 3const bodyParser = require('body-parser'); 4const post = require('./routes/post') 5 6 7app.set('views', __dirname + '/views'); 8app.set('view engine', 'ejs'); 9 10//middleware 11app.use(bodyParser.json()) 12app.use(bodyParser.urlencoded({extended:true})); 13 14 15//記事一覧ページ 16app.get('/',post.index); 17//記事詳細ページ 18app.get('/posts/:id([0-9]+)',post.show); 19//新規作成ページ 20app.get('/posts/new',post.new); 21//新規作成した記事の投稿 22app.post('/posts/create',post.create); 23//更新のための編集フォーム表示 24app.get('/posts/:id/edit',post.edit); 25//更新した記事の投稿【PUTメソッド】 26app.put('/posts/:id/',post.update); 27//記事の削除【DELETEメソッド】 28app.delete('/posts/:id/',post.destroy); 29 30 31app.listen(3100, () => { 32 console.log('server is up on port 3100') 33}); 34 35
・post.js【ルーティング処理】
javascript
1var posts = [ 2 {title: 'title0', body: 'body0'}, 3 {title: 'title1', body: 'body1'}, 4 {title: 'title2', body: 'body2'}, 5] 6 7exports.index = function(req,res){ 8 res.render('posts/index', {posts: posts}); 9}; 10exports.show = function(req,res){ 11 res.render('posts/show', {post: posts[req.params.id]}); 12}; 13exports.new = function(req,res){ 14 res.render('posts/new'); 15}; 16//更新のための編集フォーム表示 17exports.edit = function(req,res){ 18 res.render('posts/edit', {post:posts[req.params.id], id:req.params.id}); 19}; 20//更新した記事の投稿【PUTメソッド】 21exports.update = function(req,res){ 22 posts[req.body.id]={ 23 title: req.body.title, 24 body: req.body.body 25 } 26 res.redirect('/'); 27}; 28//記事の削除【DELETEメソッド】 29exports.destroy = function(req,res){ 30 posts.splice(req.body.id, 1); 31 res.redirect('/'); 32}; 33 34exports.create = function(req, res){ 35 var post = { 36 title: req.body.title, 37 body: req.body.body 38 }; 39 posts.push(post); 40 res.redirect('/'); 41};
・index.ejs【記事タイトル一覧&編集・削除ボタン】
ejs
1<%- include ('../partials/header'); %> 2<h1>Posts</h1> 3<ul> 4<% for (var i=0; i<posts.length; i++){ %> 5<li> 6 <a href="/posts/<%= i %>"><%= posts[i].title %></a> 7 <a href="/posts/<%= i %>/edit">[Edit]</a> 8 9//HTMLにはdeleteメソッドがないため、見せかけのコードで代用 10 <form method="post" action="/posts/<%= i %>"> 11//以下の一文を入れるとdeleteメソッドとして認識されるはず 12 <input type="hidden" name="_method" value="delete"> 13 14 <input type="hidden" name="id" value="<%= i %>"> 15 <input type="submit" value="削除"> 16 </form> 17</li> 18<% } %> 19</ul> 20<p><a href="/posts/new">Add new</a></p> 21<%- include ('../partials/footer'); %>
・edit.ejs【編集ページ】
ejs
1<%- include ('../partials/header'); %> 2<h1>Edit</h1> 3//HTMLにはputメソッドがないため、見せかけのコードで代用 4<form method="post" action="/posts/<%= id %>"> 5 <input type="text" name="title" value="<%= post.title %>"> 6 <input type="text" name="body" value="<%= post.body %>"> 7 8//以下の一文を入れるとputメソッドとして認識されるはず 9 <input type="hidden" name="_method" value="put"> 10 11 <input type="hidden" name="id" value="<%= id %>"> 12 <input type="submit" value="更新"> 13</form> 14 15<p><a href="/">Back to Top</a></p> 16<%- include ('../partials/footer'); %>
##問題点
「title0」の「削除」ボタン・「更新」ボタンを押すと、
Cannot POST /posts/0
404 (Not Found)
というエラーが出てしまう
##試したこと
「Cannot POST」と書かれているので、PUT,DELETEとして認識して欲しかったフォームの送信が、POSTとして認識されたままなのではないか?と疑っています。
input type="hidden" name="_method"を使ったPUT,DELETEの実装方法は古くなってしまっているのでしょうか?
2015年の記事『[html/css] httpのフォームでDELETEやPUTのメソッドを送る方法』では有効だったようです。
こちらの記事(『PUTやDELETEのHTTPリクエストを送信する方法色々』)では、「HTMLのformで”_method”として指定する方法」は実装できず、「ブラウザのバージョンが上がったことにより、動作しなくなったのかもしれません」と書かれていました。
回答2件
あなたの回答
tips
プレビュー