我目前正在使用Node / Express学习Sequelize,并且正在查看此处发布的示例:https://github.com/sequelize/express-example
我想全面了解这是如何工作的,以及它在做什么,但我之前从未使用过fs,并且无法解决这段代码所做的工作,来自index.js :
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;
});
Object.keys(db).forEach(function(modelName) {
if ("associate" in db[modelName]) {
db[modelName].associate(db);
}
});
请记住,变量db是Sequelize的一个实例。有谁可以向我解释这个?剩下的事情是有道理的,但我无法解开这个问题。谢谢!
答案 0 :(得分:2)
第一次调用readdirSync
以同步方式获取当前正在执行的脚本目录中的所有文件(在这种情况下,/models/index.js
是当前正在执行的脚本,因此__dirname
指向到models
目录。此目录中的文件为['index.js', 'task.js', 'user.js']
。
.readdirSync(__dirname)
以下函数调用会过滤掉以.
开头或名为index.js
的文件
因此,在此函数调用之后,文件列表应为['task.js', 'user.js']
。
.filter(function(file) {
return (file.indexOf(".") !== 0) && (file !== "index.js");
})
迭代每个文件名并将文件导入db。
.forEach(function(file) {
var model = sequelize.import(path.join(__dirname, file));
db[model.name] = model;
});
迭代db(Task和User)中的每个模型并调用其关联函数(如果有的话),可能是为了设置模型,外键,级联等之间的任何关联。
Object.keys(db).forEach(function(modelName) {
if ("associate" in db[modelName]) {
db[modelName].associate(db);
}
});
这似乎是一个非常有用的习惯用法,因为它允许您将模型定义(如任务和用户)保存在单独的文件中,并且它可以防止您必须使用单独的代码行(可能的代码行)单独加载每个模型很多)。这样做可以让您继续添加新模型,而不会忘记添加代码以在index.js文件中加载它。