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

Code Explanation (fs) from Sequelize Express Example

我目前正在使用 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 的一个实例。任何人都可以向我解释这个吗?其余部分都说得通,但我就是想不通这一部分。谢谢!

第一次调用 readdirSync gets all the files in the directory of the currently executing script in a synchronous fashion (in this case /models/index.js is the currently executing script, so __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");
  })

遍历每个文件名并将文件导入数据库。

  .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);
  }
});

这似乎是一个相当有用的习惯用法,因为它允许您将模型定义(如任务和用户)保存在单独的文件中,并且可以防止您不得不使用单独的代码行(其中可能有很多)。这样做可以让您继续添加新模型,而不会忘记添加代码以将其加载到您的 index.js 文件中。

Documentation for fs (File System).