当前位置: 首页 > 知识库问答 >
问题:

在NodeJS中序列化模型加载

田博超
2023-03-14

我目前正在学习使用NodeJS、Express、PostgreSQL和Sequelize on Scotch。然后我遇到了这样一个问题:

'use strict';

var fs        = require('fs');
var path      = require('path');
var Sequelize = require('sequelize');
var basename  = path.basename(module.filename);
var env       = process.env.NODE_ENV || 'development';
var config    = require(__dirname + '/../config/config.json')[env];
var db        = {};

if (config.use_env_variable) {
  var sequelize = new Sequelize(process.env[config.use_env_variable]);
} else {
  var sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(function(file) {
    return (file.indexOf('.') !== 0) && (file !== basename) & (file.slice(-3) === '.js');
  })
  .forEach(function(file) {
    var model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(function(modelName) {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

我正在寻求对这个代码的简单解释。这里到底发生了什么?

如果未设置节点环境,我确实理解默认为development的部分,但我需要澄清文件读取部分,即fs开始的部分。

共有2个答案

徐麒
2023-03-14

简单地说,这就是从与此文件相同的目录导入所有. js文件。这是通过测序['导入']方法完成的。

此外,假设所有这些文件都包含sequelize模型,因为导入的返回值映射到名为db的字典上。

db[model.name] = model

导入所有文件并将模型映射到db后,仅当模型包含associate方法时,才会运行一个循环来调用每个模型上的associate。通常使用关联方法定义模型之间的所有关联,即hasManyhasOnebelongsTo等。

公西宏毅
2023-03-14

首先,请注意,此代码由sequelize cli通过运行sequelize init生成,并放置在名为索引的文件中。js位于模型/文件夹中。

1.配置环境

if (config.use_env_variable) {
  var sequelize = new Sequelize(process.env[config.use_env_variable]);
} else {
  var sequelize = new Sequelize(config.database, config.username, config.password, config);
}

这对生产时很有帮助。作为一个例子,我将向您展示我的代码:

module.exports = {
  development: {
    dialect: 'postgres',
    username: '<username name>',
    password: 'test',
    database: '<db name>',
    host: 'localhost'
  },
  production: {
    dialect: 'postgres',
    dialectOptions: {
      ssl: true
    },
    protocol: 'postgres',
    use_env_variable: 'DATABASE_URL'
  }
}

Heroku设置了一个进程变量DATABASE\u URL,我只是简单地指向它。用户名、密码等是从中获取的,而不是在config中明确列出它们。js,作为开发凭证。

2.导入/读取模型

fs
  .readdirSync(__dirname)
  .filter(function(file) {
    return (file.indexOf('.') !== 0) && (file !== basename) & (file.slice(-3) === '.js');
  })
  .forEach(function(file) {
    var model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

fs。readdirSync同步读取其参数中给定的目录。在本例中,它是\uuu dirname,这是创建此索引的目录。js文件在中。在这里,您在models/目录中定义的模型被拉入。请注意,filter函数只是确保:

  • 有文件要读
  • 它排除这个文件(即不index.js)
  • 它们以. js结尾

然后将每个模型文件键入exports对象,行db[model.name]=model

3.关联每个模型

Object.keys(db).forEach(function(modelName) {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

最后,一旦获得了所有模型文件(从上一次读取中),我们将运行每个模型的associate函数(如果存在)。此方法在每个模型文件中定义如下:

module.exports = (sequelize, DataTypes) => {
  var Model1 = sequelize.define('Model1',
    { ... })

  // Class Method
  Model1.associate = function (models) {
    Model1.belongsTo(models.Model2)
  }
  return Model1
}

4.出口用途

sequelize数据库的实例(sequelize)和sequelize库的实例都将导出。

通过这种方式,我们现在可以执行以下操作:

假设一个目录结构

  • 模型/
    • index.js
    • model1.js
    • model2.js

    需要('。/模型')。Model1//访问您的模型

    这是导入和使用模型的方式,而不是直接通过模型的定义文件。这可确保它们正确同步和关联。

    同样,我们可以访问sequelize:

    require('./models')
      .sequelize.sync({ force: true }) // access to your sequelize db
    

 类似资料:
  • 我用的是Django 2。十、 我有一个用于验证请求的序列化程序。(不是ModelSerializer) 是对模型的引用。 我希望用户在字段中传递数据库id,但在验证后,got被转换为对象。 我试图重写方法,并将对象分配给字段,但它给出了错误

  • 问题内容: 关于如何序列化模型QuerySet的文档很多,但是如何将模型实例的字段序列化为JSON? 问题答案: 您可以轻松地使用列表来包装所需的对象,这就是Django序列化程序正确序列化它所需要的,例如:

  • 这是我的视图模型: 我正在用数据加载视图模型,并将其传递给视图并序列化它: 但是我得到了这个错误 “类型”系统。网状物无法序列化HttpPostedFileWrapper“”。考虑使用DATACONTractAttor属性对其进行标记,并标记要使用DATAMEMBAREATE属性序列化的所有成员。如果类型是集合,请考虑用CopyDATAcNoTractAttor标记它。见微软。其他受支持类型的NE

  • 问题内容: 当谈到Dart中的JSON编码时,根据Seth Ladd的赞誉 ,现在最终批准的正式方式是+ 。 假设我们有一堆模型类(PODO),例如: 现在,我希望能够像这样对我的域对象进行JSON编码: 不幸的是,这行不通… …除非我们明确告知如何编码: 我真的必须在模型类的每个类中添加一个方法,还是有更好的方法? 编辑 :这是我正在寻找的简单序列化: 例如,在ServiceStack.Text

  • 我想使用 sequelize 在我的节点应用程序中添加许多关联。我是续集ORM的新手。 我有一个eixsting模型user.js。我想创建新的模型项目,并添加想要多对多的关联 为此,我运行序列化创建表和迁移创建现在在关联部分我做的是多对多关联创建 我发现多个这些可以做到这一点 但是我写因为用户模型是存在的 我想知道的第二件事是自动创建还是需要手动创建?

  • 例如,我希望将我的套接字路由和拆分为不同的文件,但仍然可以使用回调参数,如下所示: 到目前为止,它们都在一个文件中,我不喜欢这样。

  • 问题内容: 我已经搜索了很长时间,但没有成功。我的项目未使用Django,是否有一种简单的方法可以将App Engine模型(google.appengine.ext.db.Model)序列化为JSON,还是需要编写自己的序列化程序? 模型: 问题答案: 一个简单的递归函数可用于将一个实体(和任何引用对象)转换为可传递给的嵌套字典:

  • 问题内容: 我正在尝试序列化定义为的模型对象列表: 我为json.dumps()写了一个自定义的序列化器(编码器): 当我仅序列化一个对象时,我就能做到。当我尝试序列化对象列表时,我得到 我进行了搜索,但是没有找到工作的地方。.我在考虑为模型对象列表编写自定义序列化程序。 问题答案: 自定义编码器不会递归调用。实际上,最好 不要 使用自定义编码器,而应在序列化之前将对象转换为简单的python类型