简体   繁体   English

尝试删除Node.js Express MongoDB Jade应用程序中的条目

[英]Trying to remove entry in Node.js Express MongoDB Jade app

I'm trying to add a button to my app that will delete an entry (comprising of a date and link) but seem to be running into a wall. 我正在尝试向我的应用程序添加一个按钮,该按钮将删除一个条目(包含日期和链接),但似乎正在碰壁。 When I click the button I get this error: Error 404 not found I want to enter the date and link in a form on the view (that works already), view the entries (which works) and then delete an entry and return to the current view (that's where I run into issues). 当我单击按钮时,出现以下错误: Error 404 not found我想在视图中的表单中输入日期和链接(该表单已经起作用),查看条目(起作用),然后删除条目并返回到当前视图(这就是我遇到的问题)。

My app.js file looks like this: 我的app.js文件如下所示:

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');
var database = require('./routes/database');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use('/public', express.static(__dirname + '/public'));
app.use(express.static(path.join(__dirname, 'public')));
app.use('public/js', express.static(path.join(__dirname + 'public/js')));
app.use('public/css', express.static(path.join(__dirname + 'public/css')));

app.use('/', routes);
app.use('/users', users);
app.use('/database', database)
app.use('/create', database)

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});


module.exports = app;

app.listen(8080);

console.log("The server has started");

My database.js file (which handles the GET, POST and DELETE actions) looks like this: 我的database.js文件(处理GET,POST和DELETE操作)如下所示:

var router = express.Router();
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

/* Database stuff */
//connect to the data store and the set up the database
var db = mongoose.connection;

//connect to the database
mongoose.connect('mongodb://localhost/Mandela_Diaries/data');

//Create a model which connects to the schema and entries collection in the Mandela_Diaries database
var Entry = mongoose.model("Entry", new Schema({date: 'date', link: 'string'}), "entries");

mongoose.connection.on("open", function() {
    console.log("mongodb is connected!");
});

//The route for getting data for the database - GET form
router.get("/", function(req, res) {
    //Send the current entries to the page
    Entry.find({}, function(err, entries) {
        console.log(entries);
        if(err) {
            res.status(404).json({"error": "not found", "err":err});
            return;
        } else {
            res.render('database', {title: 'database', entries: entries});
        }
    });

});

//The route for posting data to the database - POST
router.post('/', function(req, res) {
    var newEntry = new Entry(req.body);
    newEntry.save(function(err, entries){
        if (err !== null) {
            res.status(500).json(err);
        } else {
            res.redirect('database');
        };
    });
});

//The route for deleting data to the database - Delete/remove todo item by its id
router.delete('/', function (req, res) {
    Entry.findById(req.params.id)
        .exec(function(err, entries) {
            if (err || !doc) {
                res.statusCode = 404;
                res.send({});
            } else {
                entries.remove(function(err) {
                    if (err) {
                        res.statusCode = 403;
                        res.send(err);
                    } else {
                        res.send({});
                    }
                });
            }
        });
});

And the view code database.jade (where I want to route to) looks like this: 视图代码database.jade(我想路由到的地方)看起来像这样:

extends layout

block content
    .container
      .row
        .col-s-12
          h1 The Mandela Diaries Database
      .row
        .col-s-4
          h3 Add Entry
      .row
        .col-s-12
          form.form-inline(method='post', action='/create')
            .form-group
              label(for='date') Date: 
              input#datepicker.form-control.datepicker(type='text', name='date')
            .form-group
              label(for='link') Link: 
              input#link.form-control(type='string', name='link')
            button.btn.btn-default(type='submit') Submit
      .row
        p
              | Format options:
              br
              select#format
                option(value='mm/dd/yy') Default - mm/dd/yy
                option(value='yy-mm-dd') ISO 8601 - yy-mm-dd
                option(value='d M, y') Short - d M, y
                option(value='d MM, y') Medium - d MM, y
                option(value='DD, d MM, yy') Full - DD, d MM, yy
                option(value="'day' d 'of' MM 'in the year' yy") With text - 'day' d 'of' MM 'in the year' yy
      br
      ul#dbentries.col-s-12
        each entry in entries
          p= 'Date: ' + entry.date + ': Link: '
            span
              a(href="/delete/#{entries.id}") Delete

I have a feeling I'm not referencing the entries_id correctly but I could be wrong. 我有一种感觉,我没有正确引用entries_id ,但是我可能错了。 Please help :-( 请帮忙 :-(

The problem seems to be that you haven't set a param in your route. 问题似乎是您尚未在路线中设置param Also you're going to have to change your html or jade in your case, you have a(href="/delete/#{entries.id}") Delete , this will send a GET request to /delete/{id} , you need to send a DELETE request to /database/{id} . 另外,您还需要更改HTML或Jade,您有a(href="/delete/#{entries.id}") Delete ,这将向/delete/{id}发送GET请求,您需要将DELETE请求发送到/database/{id}

    // Changed path from `/` to `/:id`
    router.delete('/:id', function (req, res) {
        Entry.findById(req.params.id)
            .exec(function(err, entries) {
               // changed `if (err || !doc)` to `if (err || !entries)`
                if (err || !entries) {
                    res.statusCode = 404;
                    res.send({});
                } else {
                    entries.remove(function(err) {
                        if (err) {
                            res.statusCode = 403;
                            res.send(err);
                        } else {
                            res.send({});
                        }
                    });
                }
            });
    });

As for your jade, unless you do this request via Xhr your probably going to have to use a method override middleware . 至于您的翡翠,除非您通过Xhr发出此请求,否则您可能将不得不使用方法重写Middleware Here's an example of how a form in jade would look. 这是玉器外观的示例。

  ul#dbentries.col-s-12
    each entry in entries
      p= 'Date: ' + entry.date + ': Link: '
        span
          form(method='POST', action='/database/#{entry._id}?_method=DELETE')
            button(type='submit') Delete

Then in app.js ideally one of the first middlewares. 然后在app.js理想地是第一个中间件之一。

var methodOverride = require('method-override');
app.use(methodOverride('_method'));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM