[英]CRUD: How to delete a document by ObjectID using Node, Express, MongoDB without Mongoose?
我是后端的新手,目前使用 Node/Express/MongoDB 和前端的 EJS 模板。 我正在尝试构建一个简单的待办事项列表应用程序来练习 CRUD 操作,而无需使用 Mongoose,仅使用本机 MongoDB。很难弄清楚如何通过单击按钮使用 ObjectID 来删除/更新列表中的项目。 我一直在尝试不同的方法并寻找一个月的解决方案,但仍然没有运气。 到目前为止,我已经弄清楚了如何通过在快速删除请求过滤器中输入实际 ID 或通过将其添加到提取 url 的末尾并使用 req.params.id 来通过 ObjectID 删除和更新它用于捕获从提取 url 传递的 ID 的快速删除请求。但这不起作用,因为我不知道添加的 ObjectID 的新项目是什么。 那么,如何在不知道新 ID 是什么的情况下通过单击按钮按每个项目的 ObjectID 删除/更新它呢? 我究竟做错了什么? 似乎我需要以某种方式将 ID 传递到提取 url 的末尾,但我不确定如何获取和附加它。 请原谅集合名称大声笑这是我的动机。
这是我的代码:
//EJS CODE (index.ejs)
<!DOCTYPE html>
<html lang="en-US">
<head>
<title>Conquering</title>
<meta charset="UTF-8">
</head>
<body>
<form action="/kickass" method="POST">
<input type="text" placeholder="Name" name="name">
<input type="number" placeholder="Age" name="age">
<input type="text" placeholder="Location" name="location">
<button type="submit">Submit</button>
</form>
<ul>
<% for(let i = 0; i < kickass.length; i++) {%>
<li>
<span><%= kickass[i].name + kickass[i].age + kickass[i].location %></span>
<button type="button" class="delUserBtn">X</button>
</li>
<% } %>
</ul>
<script src="main.js"></script>
</body>
</html>
//EXPRESS CODE (app.js)
require('dotenv').config();
const express = require('express');
const bodyParser = require('body-parser');
const ejs = require('ejs');
const ObjectID = require('mongodb').ObjectID;
const MongoClient = require('mongodb').MongoClient;
const dbUrl = process.env.DATABASE_URL;
const port = process.env.PORT || 7000;
const app = express();
// SERVER
app.listen(port, () => {
console.log(`Server is listening on port ${port}..`);
});
// DATABASE
MongoClient.connect(dbUrl, { useUnifiedTopology: true }, (err, client) => {
// CHECK FOR ERRORS & CONNECTION
if (err) throw err;
console.log('Database connection established..');
// DATABASE & COLLECTION CONFIG
const db = client.db('mydb');
const dbCollection = db.collection('kickass');
// MIDDLWARES
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(express.static('public'));
// READ ROUTES
app.get('/', (req, res) => {
dbCollection.find().toArray()
.then(results => {
res.render('index.ejs', { kickass: results });
})
.catch(error => console.error(error))
});
// CREATE ROUTES
app.post('/kickass', (req, res) => {
dbCollection.insertOne(req.body)
.then(results => {
console.log(`1 document added`);
res.redirect('/');
})
.catch(error => console.error(error))
})
// DELETE ONE ROUTES
app.delete('/kickass/:id', (req, res,) => {
let o_id = ObjectID(req.params.id);
dbCollection.findOneAndDelete({ _id: o_id }, (err, result) => {
if (err) throw err;
res.send('user deleted')
})
})
});
DELETE CONTROLLER (main.js)
const delUserBtn = document.querySelectorAll('.delUserBtn');
for(let i = 0; i < delUserBtn.length; i++) {
delUserBtn[i].addEventListener('click', delUser);
};
function delUser() {
fetch('/kickass/:id', {
method: 'delete',
headers: { 'Content-Type': 'application/json' },
})
.then(res => {
if(res.ok) {
res.status(200)
}
})
.then(window.location.reload())
.catch(console.error)
};
此代码目前不起作用,但如果您将 ID 传递到提取的末尾 URL 或将 req.params.id 替换为实际 ID,它将起作用。 经过 3-4 周的研究和尝试,这正是我所处的位置。
看看这个网站:
https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes
您可以在 EJS 文件的按钮中设置自定义数据属性。 该自定义数据属性可以包含待办事项列表项的 object ID。 单击后,您可以使用“this”关键字访问 function 中的自定义数据属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.