尝试删除Node express mongoDb中的单行时删除所有记录

Posted

技术标签:

【中文标题】尝试删除Node express mongoDb中的单行时删除所有记录【英文标题】:Deleting all records when trying to delete single row in Node express mongoDb 【发布时间】:2021-09-16 01:09:15 【问题描述】:

我在我的应用程序中显示几个用户的数据,其中有编辑和删除单个记录的功能。我使用 Node express 框架并使用 MongoDb 作为数据库。我的问题是当我删除任何特定记录时所有记录都从表中删除,当我在控制台中显示结果时,它只显示我打算删除的记录。

下面是我的代码:

index.ejs

div class="container">

 <% if(users.length>0) %>

    <p>Total available users - <%= users.length  %> </p>

   
      <table class="table">

        <thead class="thead-dark">
          <tr>
            <th scope="col">Name</th>
            <th scope="col">Email</th>
            <th scope="col">City</th>
            <th scope="col">Action</th>
          </tr>
        </thead>


        <tbody>
         <%  for(var i=0;i<users.length;i++)  %>
           <tr>
            <td><%= users[i].name %></td>
            <td><%= users[i].email %></td>
            <td><%= users[i].city %></td>
            <td><a href="/edit/<%= users[i]._id %>">Edit</a> | <a id = "del" href="/delete/<%= users[i]._id %>"> Delete </a> </td>
           </tr>
         <%   %>  
        </tbody>
      
      </table>

  
  <%  else %>

     <p>No data found</p>
 <%    %>  

</div>

这会产生以下 ui:

Student.js 架构

const mongoose = require('mongoose');

const studentSchema = new mongoose.Schema(

  name:
    type:String,
    required:true
  ,
  email:
    type:String,
    required:true
  ,
  city:
    type:String,
    required:true
  ,
  timeCreated:
    type:Date,
    default:()=>Date.now()
  
);

module.exports = mongoose.model('Student',studentSchema);

server.js

const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const Student = require('./models/Student');
const dotEnv = require('dotenv').config();
const cors =  require('cors');

const app = express();

const port = process.env.PORT || 3000;

app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded(extended:true));


app.set('views', path.join(__dirname, 'views'));
app.set('view engine','ejs');

app.use("/public", express.static('public')); 
app.use(express.static(path.join(__dirname,'public')));

app.get('/delete/:id',(req,res) => 

mongoose.connect(process.env.URI,useNewUrlParser:true,
        useUnifiedTopology:true).then(() =>

            Student.findOneAndDelete(req.params.id, (err,result) => 

                if(err)
                    console.log("Error",err);
                
                else
                    res.redirect('/');
                    console.log(result + " - " + req.params.id);
                
            )
         
         ).catch((err) => console.log(err));

);

app.listen(port,() => console.log(`App is running at $port`));

有人告诉我为什么要删除所有记录而不是我要删除的记录。

【问题讨论】:

【参考方案1】:

Mongoose 提供了两种类似的方法:findOneAndDelete 将表示查询的 javascript 对象作为第一个参数,findByIdAndDelete 可以将ObjectId 作为第一个参数。因此,您可以将代码更改为:

Student.findOneAndDelete( _id: req.params.id , (err,result) => 

Student.findByIdAndDelete(req.params.id, (err,result) => 

还要确保类型匹配 - 如果 req.params.id 以字符串形式出现,并且您将 id 存储为 ObjectId,那么您需要转换它们(例如 here)。

【讨论】:

【参考方案2】:

你可以尝试 delete 请求而不是 get

app.delete('/delete/:id',(req,res) => 
mongoose.connect(process.env.URI,useNewUrlParser:true,
useUnifiedTopology:true).then(() =>

        Student.findOneAndDelete(_id: req.params.id, (err,result) => 

            if(err)
                console.log("Error",err);
            
            else
                res.redirect('/');
                console.log(result + " - " + req.params.id);
            
        )
     
     ).catch((err) => console.log(err));

);

<td><a href="/edit/<%= users[i]._id %>">Edit</a> | <form action="/delete/<%= users[i]._id %>" method="POST">
  <input type="hidden" name="id" value="<%= users[i]._id %>"/>
  <button>DELETE</button>
</form></td>

【讨论】:

以上是关于尝试删除Node express mongoDb中的单行时删除所有记录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongodb、node.js、express 和 EJS 创建动态站点地图?

我无法将数据存储到 Postman 上的 MongoDB(Atlas)中(Node.js with express)

无法将值传递到 MongoDB,使用 Node 和 Express,Mongoose

Node.js 文件上传(Express 4、MongoDB、GridFS、GridFS-Stream)

Node.JS、Express 和 MongoDB :: 多个集合

通过 Express / Node JS 将配置文件从 HTML 编辑到 MongoDB