Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript CRUD:如何在没有Mongoose的情况下使用Node、Express、MongoDB按ObjectID删除文档?_Javascript_Node.js_Mongodb_Express - Fatal编程技术网

Javascript CRUD:如何在没有Mongoose的情况下使用Node、Express、MongoDB按ObjectID删除文档?

Javascript CRUD:如何在没有Mongoose的情况下使用Node、Express、MongoDB按ObjectID删除文档?,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,我是后端新手,目前使用Node/Express/MongoDB和前端的EJS模板。我正在尝试构建一个简单的todo列表应用程序,用于在不使用Mongoose的情况下练习CRUD操作,只使用原生MongoDB。通过单击按钮使用ObjectID,很难找出如何删除/更新列表中的项目。一个月以来,我一直在尝试不同的方法,寻找解决方案,但仍然没有成功。到目前为止,我已经找到了如何通过ObjectID将其删除和更新,方法是在express delete request筛选器中键入实际ID,或者将其添加到fe

我是后端新手,目前使用Node/Express/MongoDB和前端的EJS模板。我正在尝试构建一个简单的todo列表应用程序,用于在不使用Mongoose的情况下练习CRUD操作,只使用原生MongoDB。通过单击按钮使用ObjectID,很难找出如何删除/更新列表中的项目。一个月以来,我一直在尝试不同的方法,寻找解决方案,但仍然没有成功。到目前为止,我已经找到了如何通过ObjectID将其删除和更新,方法是在express delete request筛选器中键入实际ID,或者将其添加到fetch url的末尾,并在express delete请求中使用req.params.ID来捕获从fetch url传递的ID。但这不起作用,因为我不知道添加ObjectID的新项目是什么。那么,在不知道新Id是什么的情况下,如何通过单击按钮使其通过ObjectID删除/更新每个项目呢?我做错了什么?似乎我需要以某种方式将ID传递到获取url的末尾,但我不确定如何抓取和附加它。请原谅我的收藏名称lol这是我的动机

这是我的密码:

//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>
删除控制器(main.js)
const delUserBtn=document.queryselectoral('.delUserBtn');
for(设i=0;i{
如果(res.ok){
资源状况(200)
}
})
.then(window.location.reload())
.catch(console.error)
};
此代码当前不起作用,但如果将ID传递到获取URL的末尾,或用实际ID替换req.params.ID,则此代码将起作用。这正是我经过3-4周的研究和尝试后所处的位置。

请访问此网站:


您可以在EJS文件的按钮中设置自定义数据属性。该自定义数据属性可以保存todo列表项的对象ID。单击后,您可以使用“this”关键字访问函数中的自定义数据属性。

好的,我会尝试一下,然后告诉您。非常感谢你。
//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)
};