Sequelize Express示例 - 为什么不重复调用fs.readdirSync?

时间:2017-02-07 21:41:55

标签: node.js

编辑(我想我解决了)

这是节点需要缓存!因此,第一次需要models/index.js时,它实际运行文件并点击readdirSync的调用,该调用将被执行。

然后,下次我们需要models/index.js时,它只是从缓存中提取它 - 不需要再次点击磁盘确认它为什么不是完全无效率。

============

这与Sequelize ORM项目提供的Express示例有关。 GitHub回购是https://github.com/sequelize/express-example

问题

我很困惑为什么每次需要fs.readdirSync文件时都不调用models/index.js。任何人都可以解释原因吗?

有问题的代码......

模型

models目录开始,您会找到一个index.js,它会引导模型并调用fs.readdirSync,它会读取该目录中的其余模型并加载它们(更多准确地调用sequelize.import)。

我在文件中添加了一个控制台日志。

fs
  .readdirSync(__dirname)
  .filter(function(file) {
    return (file.indexOf(".") !== 0) && (file !== "index.js");
  })
  .forEach(function(file) {
    var model = sequelize.import(path.join(__dirname, file));
    db[model.name] = model;
    console.log('#########  INSIDE FS #########');
  });

定义了另外两个模型,即task.jsuser.js,它们定义了模式并设置了一些关系。

路线

接下来,routes目录中会找到两个文件。

index.js文件定义索引路由(单个获取列出用户及其任务)。

users.js文件定义具有一些REST端点的用户,以创建新用户或为用户创建/删除任务。

两条路线均以var models = require('../models');

开头

app.js文件

app.js文件中,包含和使用路由。

更详细地重复问题

当我运行npm start并加载应用程序时,我会看到控制台中显示的readdirSync的console.log两次。

但是,如果2个路由都需要models/index.js来调用fs.readdirSync来加载2个文件,为什么fs.readdirSync不会被调用4次? (或者,如果我有更多的路线,包括模型/ index.js,那么许多乘以模型的数量)

或者问另一种方式 - 为什么在应用程序启动时只显示控制台日志?

1 个答案:

答案 0 :(得分:1)

这更像是一个node.js问题,

在初始加载后的node.js中,模块被缓存,所以当你第一次点击时,它会被缓存,不会再按顺序执行所有函数

请参阅有关节点如何工作或参考的问题,如http://fredkschott.com/post/2014/06/require-and-the-module-system/