Sequelize Express示例 – 为什么不重复调用fs.readdirSync?
编辑(我想我解决了它)
这是节点需求caching! 所以第一次它需要models/index.js
它实际上运行该文件,并打到readdirSync调用被执行。
然后,下一次我们需要models/index.js
,只需从caching中取出它 – 无需再次点击磁盘,以确认为什么它不是一个完全的低效率。
============
这与Sequelize ORM项目提供的快速示例相关。 GitHub repo是https://github.com/sequelize/express-example
这个问题
我很困惑,为什么每次需要models/index.js
文件时都不会调用fs.readdirSync
。 有人可以解释为什么吗?
有问题的代码…
楷模
从models
目录开始,您将find一个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.js
和user.js
,它们定义了Schema并设置了一些关系。
路线
接下来,在routes
目录中你会发现两个文件。
index.js
文件定义了索引路由(单个获取列出用户及其任务)。
users.js
文件使用一些REST端点定义用户,以创build新用户或为用户创build/删除任务。
两条路线都以var models = require('../models');
app.js文件
在app.js
文件里面,包含和使用了路由。
重复的问题更多的细节
当我运行npm start
并加载应用程序时,我从console中显示的readdirSync中看到console.log两次。
但是,如果2路由都需要models/index.js
调用fs.readdirSync
加载2个文件为什么fs.readdirSync不会被调用4次? (或者如果我有更多的路线,包括模型/ index.js乘以许多模型)
或者以另一种方式问 – 为什么应用程序启动时只显示控制台日志?
这是更多的node.js问题,
在初始加载后的node.js中,模块被caching,所以当你第一次打开require时,它将被caching,并且不会再次执行所有的函数
请参考有关节点如何工作或参考的问题http://fredkschott.com/post/2014/06/require-and-the-module-system/