我知道这个问题已经问过几次了,但是似乎没有人回答稍后使用查询结果的特定部分。
我也知道问题出在查询是异步的,也许这就是我似乎找不到满意答案的原因。
这就是我想要做的:
我有一个包含几个部分的节点项目,每个部分具有不同的内容。这些部分具有单独的属性,我决定将其存储在模型中以供以后使用。
到目前为止(为了简单起见),我具有以下架构:
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还是很陌生,所以我还不太了解如何处理问题。
谢谢。
编辑:我应该提到我在使用快递。
答案 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)
})}