【发布时间】: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