繁体   English   中英

CRUD:如何使用没有 Mongoose 的 Node、Express、MongoDB 通过 ObjectID 删除文档?

[英]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.

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