Sequelize Express示例中的代码说明(fs)

时间:2015-09-15 17:28:40

标签: node.js sequelize.js fs

我目前正在使用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的一个实例。有谁可以向我解释这个?剩下的事情是有道理的,但我无法解开这个问题。谢谢!

1 个答案:

答案 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文件中加载它。

Documentation for fs (File System).