Node.js应用程序中的编辑不起作用

Edit in Node.js app not working

本文关键字:编辑 不起作用 js 应用程序 Node      更新时间:2024-01-15

我正在构建的节点应用程序出现了一些问题,我附加到页面上的编辑按钮不起作用(没有显示特定条目),当我点击编辑时,我只得到了404错误

stores/index.ejs

<table class="table table-striped">
        <thead>
        <tr>
            <th>Pet Store Name</th>
            <th>Address</th>
            <th>Phone Number</th>
            <th>Website</th>
        </tr>
        </thead>
        <tbody>
        <!--starting table loop-->
        <% for (var i = 0; i < stores.length; i++) { %>
        <tr>
            <td><%= stores[i].name %></td>
            <td><%= stores[i].address %></td>
            <td><%= stores[i].phone %></td>
            <td><a href="http://<%= stores[i].website %>">http://<%= stores[i].website %></a></td>
            <td><a href="/stores/edit/<%= stores[i]._id %>"><button class="btn btn-primary"
                                                             type="button">Edit</button></a></td>
        </tr>
        <% } %>
        </tbody>
    </table>

edit.ejs

 <form method="post" action="<%= stores._id %>">
        <fieldset class="form-group">
            <label for="name" class="col-sm-2">Pet Store Name: </label>
            <input name="name" id="name" required value="<%= stores.name %>" />
        </fieldset>
        <fieldset class="form-group">
            <label for="address" class="col-sm-2">Address: *</label>
            <input name="address" id="address" required value="<%= stores.address %>" />
        </fieldset>
        <fieldset class="form-group">
            <label for="phone" class="col-sm-2">Phone Number: *</label>
            <input name="phone" id="phone" value="<%= stores.phone %>" />
        </fieldset>
        <fieldset class="form-group">
            <label for="website" class="col-sm-2">Website: </label>
            <input name="website" id="website" value="<%= stores.website %>" />
        </fieldset>
        <div>
            <%= stores.created %>
        </div>
        <button class="btn btn-primary col-sm-offset-2">Save</button>
        <a href="/stores/delete/<%= stores._id %>" title="Delete" class="confirmation">
            <button class="btn btn-danger" type="button">Delete</button>
        </a>
    </form>

index.js

// link to dependencies
var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
var passport = require('passport');
//link to store model
var Store = require('../models/store');
//set up get handler for password protected store page
router.get('/', isLoggedIn, function (req, res, next) {
    //use the store model to get directory listing
    Store.find(function (err, stores) {
        if (err) {
            console.log(err);
            res.end(err);
        }
        else {
            //show we got data back, show the view and pass the data through it
            res.render('stores/index', {
                title: 'Pet Store Directory',
                stores: stores
            });
        }
    })
});
// get handler for add to display a blank form
router.get('/add', isLoggedIn, function (req, res, next) {
    res.render('stores/add', {
        title: 'Add a new Pet Store'
    });
});
// post handler for adding to the form
router.post('/add', isLoggedIn, function (req, res, next) {
    //save new pet store
    Store.create({
            name: req.body.name,
            address: req.body.address,
            phone: req.body.phone,
            website: req.body.website
        }
    );
    // redirect to auth store page
    res.redirect('/stores');
});
//get handler for edit to show content from entry
router.get('/id', isLoggedIn, function(req, res, next){
   //create id variable to the store id from the url
    var id = req.params.id;
    //look up the selected store
    Store.findById(id, function(err, store){
       if (err) {
           console.log(err);
           res.end(err);
       } 
        else {
           //show edit form
           res.render('stores/edit', {
              title: 'Store Details',
               store: store
           });
       }
    });
});
//post handler for edit to update the store
router.post('/id', isLoggedIn, function(req, res, next){
    //create id variable to the store id from the url
    var id = req.params.id;
    //fill the store object
    var store = new Store({
        name: req.body.name,
        address: req.body.address,
        phone: req.body.phone,
        website: req.body.website
    });
    //use mongoose and store model to update
    Store.update( {_id: id}, store, function(err){
       if   (err){
           console.log(err);
           res.end(err);
       }
        else {
           res.redirect('/stores')
       }
    });
});
//get handler for delete using the store id
router.get('/delete/:id', isLoggedIn, function(req, res, next){
    //get id variable to the store id from the url
    var id = req.params.id;
    console.log('trying to delete');
    Store.remove({_id: id}, function(err){
       if (err) {
           console.log(err);
           res.end(err);
       }
        else {
           // show updated article list
           res.redirect('/stores');
       }
    });
});
//authorization check
function isLoggedIn(req, res, next) {
    //is the user authenticated
    if (req.isAuthenticated()){
        return next();
    }
    else {
        res.redirect('/auth/login');
    }
}
// make public
module.exports = router;

我已经花了几个小时研究代码,这将有助于重新审视它。

github是github.com/krl87/comp2106a2

托管于comp2106a2.herokuapp.com

提前感谢!kayley

我在任何地方都看不到/edit/:id的路由。有一个只是说/id。我想你是想把/edit/:id放在那里。所以改变:

router.get('/id', isLoggedIn, function(req, res, next){

router.get('/edit/:id', isLoggedIn, function(req, res, next){

与相同。更改:

router.post('/id', isLoggedIn, function(req, res, next){

router.post('/edit/:id', isLoggedIn, function(req, res, next){