2017-03-26 8 views
0

私はWebアプリケーションにCRUDを実装する際に問題があります。データはmongoDBにクラウド上のFORMを使用して正常に保存され、ユーザーのデータも表示できます。しかし、私の問題は、それらを削除するために、挿入されたデータを更新することです。 私のコードを見てください。私がリンクを更新/削除すると、私はGET /削除できません。またはGET /更新できません。 誰かが私を助けることができれば感謝します。Express Router CRUDデータの更新と削除

server.js

app.get("/guestbook", function(req,res){ 

     // res.render("pages/guestbook",{ 
     db.collection('newmessage').find().toArray(function (err, result) { 
     if (err) return console.log(err) 
     res.render('pages/guestbook', {newmessage: result}); 

    }); 

      }); 
//Form to insert Guest book messages 
     app.get("/newmessage", function(req,res){ 
      res.sendFile(__dirname + "/pages/newmessage"); 

      res.render("pages/newmessage",{ 
       add_newMessage:"Add Your info & message!" 
      }); 

     }); 
//Accepts users inputs and saves to mongoDB 
     app.post("/newmessage" , function(req,res){ 
     var guestMessage = { 
      username:req.body.username, 
      country:req.body.country, 
      message:req.body.message, 
      date:req.body.date 
     }; 
     //assert.equal(null, err); 
    db.collection('newmessage').insertOne(guestMessage, function(err, result) { 
     if (err) return console.log(err); 
     console.log('Message saved to database'); 
     res.redirect('/guestbook'); 
    }); 

     }); 
    app.post("/update/:id", function (req,res){ 
    var guestMessage = { 
      username:req.body.username, 
      country:req.body.country, 
      message:req.body.message, 
      date:req.body.date 
     }; 
     var Gid = req.params.id; 

    db.collection('newmessage').findById(Gid, {$set: guestMessage}, function(err, result) { 
     if (err) return console.log(err); 
     result.save(function (err,result) { 
     console.log('Message Updated'); 
      res.redirect('/guestbook'); 
     }) 


    }); 


     }); 

    app.get("/delete/: id" , function (req, res) { 
    var Gid = req.params.id.toString(); 

    db.collection('newmessage').findById(Gid, function(err, result) { 
    result.remove(function (err, result) { 
     res.redirect('/guestbook'); 
    }); 


    }); 

}); 

newmessage.ejs

<!DOCTYPE html> 
<html lang="en"> 
<head> 

    <% include ../partials/head %> 
</head> 

<body class="container"> 

    <header> 
     <% include ../partials/header %> 
    </header> 
    <main> 
     <div class="jumbotron"> 

     <form class="messageForm" method="post" action="/newmessage"> 
      <fieldset> 
      <legend><%= add_newMessage %></legend> 

    <div class="form-group"> 
     <label for="username">Username:</label> 
     <input type="text" class="form-control" id="username" name ="username" placeholder="Enter Username"> 
    </div> 
    <div class="form-group"> 
     <label for="country">Country:</label> 
     <input type="text" class="form-control" id="country"name="country" placeholder="Enter country"> 
    </div> 
    <div class="form-group"> 
     <label for="message">Message:</label> 
     <input type="text" class="form-control" id="message" name= "message" placeholder="Enter message"> 
    </div> 
    <div class="form-group"> 
     <label for="date">Date:</label> 
     <input type="date" class="form-control" id="date"name="date" placeholder="Enter date"> 
    </div> 

    <button type="submit" class="btn btn-default">Submit</button> 


    </fieldset> 

</form> 

     </div> 
    </main> 

    <footer> 
<% include ../partials/footer %> 
</footer> 
</body> 

</html> 

guestbook.ejs

更新のために3210
<!DOCTYPE html> 
<html lang="en"> 
<head> 

    <% include ../partials/head %> 
</head> 

<body class="container"> 

    <header> 
     <% include ../partials/header %> 


    </header> 
    <main> 
     <div class="jumbotron"> 

      <table border = "1"> 
       <tr> 

        <th>Name</th> 
        <th>Country</th> 
        <th>Message</th> 
        <th>Date</th> 
         <th>Edit</th> 
         <th>Delete</th> 
       </tr> 

      <% for(var i=0; i<newmessage.length; i++) {%> 


       <tr> 

        <td class="userInput"><%= newmessage[i].username %></td> 
        <td class="userInput"><%= newmessage[i].country %></td> 
        <td class="userInput"><%= newmessage[i].message %></td> 
        <td class="userInput"><%= newmessage[i].date %></td> 
        <td class="userInput"><a href="/update/<%= newmessage._id %>">Update</a></td> 
        <td class="userInput"><a href="/delete/<%= newmessage._id %>">Delete</a></td> 
       </tr> 


      <%} %> 
      </table> 


</div> 
    </main> 

    <footer> 
<% include ../partials/footer %> 
</footer> 

</body> 

</html> 

Sample OutPut/image

答えて

0

、あなたが作成、更新のためのapp.getを要求したり、操作を削除しないでください

app.put('/your_route/:id',function(e,r){}); 
app.delete('/your_route/:id',function(e,r){}); 

使用を削除します。前の回答が言うように

1

まず、データベース内のエントリを更新することは、伝統的にon MDN hereを見られるように、伝統的にHTTP DELETE方法を使用することを含む、データベース内のエンティティをon MDN hereを見られるように、HTTP PUT方法を使用して、および削除が含まれます。つまり、前の回答のとおり、app.putapp.deleteを宣言することで、Expressアプリケーションでこれらのメソッドを利用したいと考えています。

これらのメソッドを使用する際の問題は、これらのメソッドがHTMLページでうまく機能しないことです。何らかの理由で、今すぐ覚えていないことがあります。したがって、開発者はこれらのメソッドを使用する巧妙な方法を考え出す必要がありました。最も簡単な方法は、クエリ文字列にメソッドを指定することです。

などのミドルウェアが必要な場合は、app.putなどの定義したルートを利用することをExpressが知っているように、アプリにどのようにHTTPメソッドを宣言するかを伝えるミドルウェアが必要です。この特定のパッケージを使用するには、これらの更新および削除ボタンをPOSTメソッドでフォームにする必要があります。アクションでは、クエリパラメータを使用してメソッドを指定します。たとえば、あなたのserver.jsに次のように続いて

// ... 
const methodOverride = require('method-override'); 
// ... 
const app = express(); 
// ... 
app.use(methodOverride('_method'); 

、更新ボタンのために使用するには、formであることにaタグであることから、ボタンを変更する必要があると思います:

<form method="POST" action="/update?_method=PUT"> 
    // inputs to change the data go here 
    <button type="submit">Update</button> 
</form> 

この方法で、ユーザーがボタンをクリックすると、ExpressはPUT要求としてPOST要求を解析し、適切なミドルウェアを呼び出します。すべてのルートの宣言の前にapp.use(methodOverride('_method'))行を置いてください。

あなたの質問に対するより直接的な答えとして、aタグは定義上、GETリクエストのみを行うHTML要素であり、あなたは定義していないため、「GET /更新できません」という理由があります。 '/ update'へのGET要求のためのExpressルート。もちろん、メソッドのオーバーライドを無視し、POSTメソッドを使用して標準form要素の2つのaタグを切り替えることができます(これはserver.jsのルートをどのように定義したか分かります)。ベストプラクティスから避けてください。

関連する問題