您如何将猫鼬查询的结果保存到变量中,以便以后在代码中使用它的值?

时间:2018-06-30 12:13:00

标签: node.js mongodb mongoose

我知道这个问题已经问过几次了,但是似乎没有人回答稍后使用查询结果的特定部分。

我也知道问题出在查询是异步的,也许这就是我似乎找不到满意答案的原因。

这就是我想要做的:

我有一个包含几个部分的节点项目,每个部分具有不同的内容。这些部分具有单独的属性,我决定将其存储在模型中以供以后使用。

到目前为止(为了简单起见),我具有以下架构:

const SectionSchema = new Schema({
    name: String,
    description: String
})

const Section = mongoose.model('Sections',SectionSchema)

我想检索要在我的一种布局(导航标题)中使用的数据,所以我尝试了如下操作:

const express = require('express')
const app = express()

Section.find().then(function(docs){
    app.locals.sections = docs
})

console.log(app.locals.sections) // undefined

由于find()是异步的,因此这显然不能完全起作用,或者确实可以,但是值是在不同的时间填充的。我知道,如果我在函数中进行console.log检查,我会得到结果,但这不是问题,我想将数据存储在app.locals中,以便以后可以在一个中使用它。我的布局。

理想情况下,我希望在服务器开始侦听请求之前将这些数据加载一次。

如果我有任何错误的假设,请随时纠正我,我对Node还是很陌生,所以我还不太了解如何处理问题。

谢谢。

编辑:我应该提到我在使用快递。

1 个答案:

答案 0 :(得分:1)

您的节点应用可能包含HTTP请求的路由处理程序。如果在回调之外调用app.locals.section,则它将是未定义的,但它将存在于路由处理程序中。

假设您使用的是Express或Restify之类的东西

const app = restify.createServer()

app.get('/', (req, res) => {
    return res.json(app.locals.sections)
})

Section.find().then(function(docs){
    app.locals.sections = docs
})

console.log(app.locals.section) // is undefined

app.listen(8080-, ()=>{
  console.log('Server started   ',8080)
})

实际上,如果数据库调用花费了很长时间,或者用户在启动后很快就超级点击了应用,则可能不确定。在回调中启动服务器将确保在每种情况下都存在app.locals.section:

Section.find().then(function(docs){
    app.locals.sections = docs
    app.listen(8080-, ()=>{
      console.log('Server started   ',8080)
    })
})

您可以在函数中使用async / await,以使其看起来好像没有在使用promise。但是您不能在模块的顶层使用它。看到这里:How can I use async/await at the top level?

在诺言链中进行所有应用启动确实是很习惯的。这是一种您会经常看到的编码风格。

Section.find().then((docs)=>{app.locals.sections = docs})
    .then (()=>{/*dosomething with app.locals.sections */})
    .then(startServer)


function startServer() {app.listen(8080-, ()=>{
  console.log('Server started   ',8080)
})}