Javascript 正在尝试删除Node.js Express MongoDB应用程序中的条目
我正在尝试向我的应用程序添加一个按钮,该按钮将删除一个条目(包括日期和链接),但似乎遇到了障碍。当我点击按钮时,我得到了这个错误:Javascript 正在尝试删除Node.js Express MongoDB应用程序中的条目,javascript,node.js,mongodb,express,pug,Javascript,Node.js,Mongodb,Express,Pug,我正在尝试向我的应用程序添加一个按钮,该按钮将删除一个条目(包括日期和链接),但似乎遇到了障碍。当我点击按钮时,我得到了这个错误:error 404 not found我想在视图中的表单中输入日期和链接(已经可以使用),查看条目(可以使用),然后删除条目并返回到当前视图(这就是我遇到问题的地方) 我的app.js文件如下所示: var express = require('express'); var path = require('path'); var favicon = require('
error 404 not found
我想在视图中的表单中输入日期和链接(已经可以使用),查看条目(可以使用),然后删除条目并返回到当前视图(这就是我遇到问题的地方)
我的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");
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({});
}
});
}
});
});
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
我的database.js文件(处理GET、POST和DELETE操作)如下所示:
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");
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({});
}
});
}
});
});
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
view code database.jade(我要路由到的位置)如下所示:
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");
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({});
}
});
}
});
});
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
我感觉我没有正确引用
条目\u id
,但我可能错了。请帮助:-(问题似乎是您没有在路线中设置参数。此外,您还必须更改html或jade。在您的情况下,您有a(href=“/delete/#{entries.id}”)delete
,这将向/delete/{id}发送GET
请求
,您需要向/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({});
}
});
}
});
});
至于您的翡翠,除非您通过Xhr执行此请求,否则您可能必须使用。下面是一个示例,说明翡翠中的形状的外观
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
然后在app.js
中,理想情况下是第一批中间件之一
var methodOverride = require('method-override');
app.use(methodOverride('_method'));
问题似乎是您没有在路由中设置param
。此外,您还必须更改html或jade。在您的情况下,您有a(href=“/delete/#{entries.id}”)delete
,这将向/delete/{id}发送GET
请求
,您需要向/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({});
}
});
}
});
});
至于您的翡翠,除非您通过Xhr执行此请求,否则您可能必须使用。下面是一个示例,说明翡翠中的形状的外观
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
然后在app.js
中,理想情况下是第一批中间件之一
var methodOverride = require('method-override');
app.use(methodOverride('_method'));
问题似乎是您没有在路由中设置param
。此外,您还必须更改html或jade。在您的情况下,您有a(href=“/delete/#{entries.id}”)delete
,这将向/delete/{id}发送GET
请求
,您需要向/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({});
}
});
}
});
});
至于您的翡翠,除非您通过Xhr执行此请求,否则您可能必须使用。下面是一个示例,说明翡翠中的形状的外观
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
然后在app.js
中,理想情况下是第一批中间件之一
var methodOverride = require('method-override');
app.use(methodOverride('_method'));
问题似乎是您没有在路由中设置param
。此外,您还必须更改html或jade。在您的情况下,您有a(href=“/delete/#{entries.id}”)delete
,这将向/delete/{id}发送GET
请求
,您需要向/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({});
}
});
}
});
});
至于您的翡翠,除非您通过Xhr执行此请求,否则您可能必须使用。下面是一个示例,说明翡翠中的形状的外观
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
然后在app.js
中,理想情况下是第一批中间件之一
var methodOverride = require('method-override');
app.use(methodOverride('_method'));
嘿,伙计。谢谢你的回答。我刚离开办公室就发布了这个,所以我现在要测试你的解决方案。嘿,Nindaff。谢谢你的代码。当我单击“删除”按钮时,我似乎遇到了问题。它带我到(其中entry_id是条目的数值)我得到一个404未找到。嗨,Siya,这似乎是插值的问题。您需要将该请求发送到localhost:8080/database/{ObjectId}
。这可能有一些原因;但我认为这是一个jade语法问题。你能用你的jade代码片段和请求处理程序发布一个编辑吗?好的,我认为我的jade搞错了。表单(method='post',aciton='/database/'+entry.\u id+'/?\u method=DELETE')
应该正确插入,您也可以通过检查浏览器中的属性进行检查。希望有帮助。嘿,Nandaff。查看我的Github项目报告:我尝试了一个要点,但失败了。嘿,伙计。谢谢你的回答。我在离开办公室之前发布了这个,所以我现在将测试你的解决方案。嘿,Nindaff。谢谢你的帮助代码。当我单击“删除”按钮时,我似乎遇到了问题。它将我带到(其中entry_id是条目的数值),我得到一个404 not found。嗨,Siya,这似乎是插值的问题。您希望将该请求发送到localhost:8080/database/{ObjectId}
。这可能有一些原因;但我认为这是一个jade语法问题。你能用你的jade代码片段和请求处理程序发布一个编辑吗?好的,我认为我的jade搞错了。表单(method='post',aciton='/database/'+entry.\u id+'/?\u method=DELETE')
应该正确插入,您也可以通过检查浏览器中的属性进行检查。希望有帮助。嘿,Nandaff。查看我的Github项目报告:我尝试了一个要点,但失败了。嘿,伙计。谢谢你的回答。我在离开办公室之前发布了这个,所以我现在将测试你的解决方案。嘿,Nindaff。谢谢你的帮助代码。当我单击“删除”按钮时,我似乎遇到了问题。它将我带到(其中entry_id是条目的数值),我得到一个404 not found。嗨,Siya,这似乎是插值的问题。您希望将该请求发送到localhost:8080/database/{ObjectId}
。这可能有一些原因;但我认为这是一个jade语法问题。你能用你的jade代码片段和请求处理程序发布一个编辑吗?好的,我认为我的jade搞错了。表单(method='post',aciton='/database/'+entry.\u id+'/?\u method=DELETE')
应该正确插入,您也可以通过在浏览器中检查属性来进行检查。希望有帮助。嘿,Nandaff。查看我的Github项目报告:我尝试了做要点,但失败了。嘿,妈