我正在做一个学习项目,创建一个简单的Web应用程序来编写和存储待办事项,这时我遇到了一个我无法解决的问题.我用Mongoose模块创建了这个简单的JavaScript应用程序来重现这个问题.它创建名为"test"item1个对象并将其存储在数据库中.然后,它将删除名称为"test"的所有对象.正如你在截图上看到的,这款应用成功地创建并存储了ignores deleting them, which is my initial goal个对象.

我提前感谢所有人的帮助.


Screenshot describing the problem


我的JavaScript代码:

const express = require("express");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");

const app = express();

mongoose.connect("mongodb://localhost:27017/testDB", {useNewUrlParser: true});

app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({extended: true}));
app.use(express.static("public"));

const itemsSchema = new mongoose.Schema({
    name: String
});
const Item = mongoose.model("Item", itemsSchema);

const item1 = new Item({
    name: "test"
});
item1.save();

app.get("/", function(req, res){
    console.log("get request received");
    Item.deleteMany({name: "test"});
});

app.listen(3000, function(){
    console.log("Server started on port 3000");
});

终端输出:

$ node app.js
(node:2868) [MONGODB DRIVER] Warning: useNewUrlParser is a deprecated option: useNewUrlParser has no effect since Node.js Driver version 4.0.0 and will be removed in the next major version       
(Use `node --trace-warnings ...` to show where the warning was created)
Server started on port 3000
get request received

运行应用程序并发送GET个请求后的数据库条目:

testDB> db.items.find()
[
  { _id: ObjectId('658de5a4687d08a6d992f578'), name: 'test', __v: 0 },
  { _id: ObjectId('658de5df82d80828a24ef6ca'), name: 'test', __v: 0 },
  { _id: ObjectId('658de60b1fb7cb4857d913d3'), name: 'test', __v: 0 }
]

Tried:个Delete One()和DeleteMany()命令.

Expected to happen:删除数据库中名为"test"的所有元素.

数据库中存储了Actually resulted:个对象,但没有删除元素.

推荐答案

Mongoose数据库操作需要使用它们的then()函数来执行,或者使用async/await来执行,这允许它们的行为就像它们返回了一个已确定的promise ,因为mongoose queries are not actually promisies.它们也可以使用exec()函数来执行,该函数will返回promise 并将以此方式运行.如果不使用then()async/await,则不会执行查询.

下面是两个例子:

app.get("/", function(req, res){
    console.log("get request received");
    Item.deleteMany({name: "test"}).then(obj => {
       console.log(obj.deletedCount);
       res.send(`Deleted ${obj.deletedCount} documents`);
    }).catch(err => {
       console.log(err);
       res.send(`Err或 on server`);
    });
});

app.get("/", async function(req, res){ //< Mark as async
   console.log("get request received");
   try{
      const obj = await Item.deleteMany({name: "test"});
      res.send(`Deleted ${obj.deletedCount} documents`);
   }catch(err){
      console.log(err);
      res.send(`Err或 on server`);
   }
});

These give you the two asynchronous patterns that you can adopt f或 your database queries to get you started but when deleting rec或ds you should pass a resource identifier in your requests such as the ObjectId of the document and use approp或aite HTTP request verbs eg. app.delete and app.post.

Javascript相关问答推荐

如何访问Json返回的ASP.NET Core 6中的导航图像属性

使用AJX发送表单后,$_Post看起来为空

如何从JSON数组添加Google Maps标记—或者如何为数组添加参数到标记构造器

React 17与React 18中的不同setState行为

React Code不在装载上渲染数据,但在渲染上工作

将2D数组转换为图形

成功完成Reducers后不更新状态

如何从调整大小/zoom 的SVG路径定义新的d属性?""

如何从HTML对话框中检索单选项组的值?

在forEach循环中获取目标而不是父对象的属性

如何将innerHTML字符串修剪为其中的特定元素?

为什么客户端没有收到来自服务器的响应消息?

在不删除代码的情况下禁用Java弹出功能WordPress

处理TypeScrip Vue组件未初始化的react 对象

如何根据查询结果重新排列日期

是否可以在不更改组件标识的情况下换出Reaction组件定义(以维护状态/引用等)?如果是这样的话,是如何做到的呢?

如何使用Reaction路由导航测试挂钩?

Reaction-在同一页内滚动导航(下拉菜单)

如何按区域进行过滤并将其从结果数组中删除?

鼠标进入,每秒将图像大小减小5%