【问题标题】:How can data schema be rejected before the mongodb connection is made by node.js and mongoose?在node.js和mongoose建立mongodb连接之前如何拒绝数据模式?
【发布时间】:2021-01-31 16:10:26
【问题描述】:

我不了解特定的异步 javascript 代码:我有几行非常简单的由 node.js 运行的 javascript,我在其中查询本地 mongoDB,主要是这样做的:

  • 需要猫鼬
  • 承诺连接到数据库
mongoose.connect("...url to my local mongoDB...")
     .then(console.log("Connected to DB..."))
  • 创建架构
  • 从架构创建模型
  • 定义一个异步函数来创建一个新对象,将其保存为 mongoDB 中的文档并在 console.log 尝试保存文档后返回的结果。

我不明白的是console.log("Connect to DB")和console.log(result from document.save())的顺序:确实,当保存没有错误时,顺序似乎没问题:我首先有“连接到数据库...”,然后是返回的保存文档:

但是当不遵守某些要求而出现数据验证错误时,则在“Connected to DB”之后打印“Connected to DB”:

关于代码的结构,我不明白为什么在打印错误后会打印“已连接到数据库...”。我怀疑异步代码是原因,但我不明白为什么。这段非常简单的几行代码来自“Mosh 编程”课程,我们可以在他的控制台上看到完全相同的行为。

更多代码细节:

    const mongoose = require("mongoose")
    mongoose
      .connect(my_mongo_db_url)
      .then(() => console.log("Connected to DB"))
      .catch(err => console.log("Could not connect to DB"))
    
    const courseSchema = new mongoose.Schema({ ...course schema... })
    const Course= mongoose.model("Course", courseSchema )
    
    async function createCourse(){
      const course = new Course({ ...new course values... })
      try { const result = await course.save()}
      catch (err) { console.log(err.message)}
    }
    
    createCourse()

【问题讨论】:

  • 可以在与数据库的连接可用之前验证数据,因为提供了架构,但不可能保存在连接之前。
  • 代码的哪一行抛出了验证错误?因为courseSchema =Course=course = 都将在connect 中执行连接的实际代码甚至有机会开始之前全部执行
  • @jonrsharpe,好的,我明白了,db 错误不是由 db 引擎返回,而是由节点本身验证或不验证我的数据,并且由于整个 index.js 是异步的,因此 createCourse()并且在建立与数据库的连接之前执行(并拒绝)其内部验证。好,谢谢。但在那种情况下,由于整个 index.js 是异步的,当没有错误时, createCourse() 中的 course.save() 如何在连接到数据库之前不执行(所以我会有一个错误比如“还没有数据库连接”)
  • @JaromandaX,错误来自createCourse()中await course.save()的try/catch
  • 对 course.save 的调用可能在连接建立之前执行,但其内部实现等待连接:mongoosejs.com/docs/connections.html#buffering

标签: javascript node.js mongodb mongoose async-await


【解决方案1】:

我在这里复制了回答我问题的@jonrsharpe 评论:

“对 course.save 的调用可能会在建立连接之前执行,但其内部实现会等待连接:https://mongoosejs.com/docs/connections.html#buffering

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 2017-09-08
    • 2021-03-06
    • 2019-02-19
    • 1970-01-01
    • 2019-03-06
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多