【问题标题】:NodeJS | Wait for an operation to finish in another script节点JS |在另一个脚本中等待操作完成
【发布时间】:2021-08-03 19:04:12
【问题描述】:

长话短说,我希望从myModule 导出的对象仅在第一个脚本连接到数据库后创建;然后与任何需要它的脚本共享myObject。这可以做到吗?做同样事情的更聪明的选择是什么?

//mainapp.js

const mongoose = require('mongoose');

/*application setup stuff*/

mongoose.connect(/*...*/);
//myModule.js

const mongoose = require('mongoose');

class myClass {
  constructor(){
    /*db operations*/
    this.myVar = /*...*/;
  }
}

module.exports = new myClass();
//script.js,script2.js,script3.js...

import myObject = require('./myModule');

/*...*/ = myObject.myVar;

【问题讨论】:

  • 你已经用express标记了这个,这意味着你在启动服务器时建立了连接。然后你只在路由处理程序中运行查询代码。问题解决了。 (导出类,而不是实例,稍后再创建实例)
  • @ChrisG 但是如果我导出类,那么我不能将同一个实例导入多个脚本:\我错了吗?
  • 您可以使用singleton pattern。如果对象尚不存在,则导出创建对象并返回它的函数。这样所有模块都将使用相同的实例。
  • @ChrisG 这正是我正在寻找的答案,如果你以答案的形式写出来,我可以标记它。您是否必须推荐更聪明的方法来做同样的事情?我想要做的是有一个我从数据库加载一次的结构,以便在不同的脚本中重用。我知道我可以避免使用数据库,但我正在努力解决。
  • 我又看了一遍,导出实例应该可以正常工作。只要在实例初始化后访问它的道具,我不明白为什么它不应该,但我还没有测试它。你试过这个并遇到问题吗?

标签: javascript node.js express mongoose


【解决方案1】:

我希望仅在第一个脚本连接到数据库后创建从 myModule 导出的对象

只有成功建立数据库连接后才能启动服务器。

const app = express();

mongoose.connect(/*...*/).then(() => {
      app.listen(process.env.PORT, () =>
      console.log(`Example app listening on port ${process.env.PORT}!`),
    );
}).catch((err) => console.error(err));

【讨论】:

  • 这是我一直在做的事情,但是当我启动主脚本时,所有依赖的脚本/模块都会被执行,还是我错了?
  • @nostyn 你不能从script.js 导出myObject 并将其导入其他脚本而不从myModule.js 导入它吗?不知道能不能解决问题...
  • 它会起作用,但我不知道它们被调用的顺序。我使用myObject 作为一种个人缓存:我从数据库加载了一个信息块,我希望能够在不同的脚本中使用它。我不想用redis或其他库,我想自己弄清楚怎么做。
猜你喜欢
  • 2020-04-01
  • 2016-01-20
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多