问题描述
我对这个问题的目标是在我的 node.js(不是打字稿)项目中以安全和可持续的方式实现 VS Code 智能感知和 Sequelize 模型定义。
可以构建Sequelize模型
- 通过钩子,或
- 通过扩展模型类。
用钩子创建的模型不会被智能感知理解,所以我在下面关注后者。
Sequelize 模型构造函数需要配置的 Sequelize 连接实例。至少有两种方法可以适应这一点。
A - 在每个模型旁边实例化 sequelize(即:多次)
一个documented example of model definition:
const { Sequelize,DataTypes,Model } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory');
class User extends Model {}
User.init({
// Model attributes are defined here
firstName: {
type: DataTypes.STRING,allowNull: false
},lastName: {
type: DataTypes.STRING
// allowNull defaults to true
}
},{
// Other model options go here
sequelize,// We need to pass the connection instance
modelName: 'User' // We need to choose the model name
});
在本例中,sequelize
连接与模型定义一起在同一个文件中实例化。
我们可以在许多模型定义文件中完全重复这一点。然后每个文件都可以导出一个模型类,调用者可以直接使用该类。
Intellisense 会理解这个设置。
B - 实例化 sequelize 一次,然后将其传递
Sequelize CLI 促进了以下项目结构:
- 每个模型定义文件都导出一个构建
Model
类的函数。该函数接受sequelize
实例作为参数。 -
models/index.js
文件实例化sequelize
-- 项目中唯一发生这种情况的地方。然后调用每个模型定义函数,并将此sequelize
实例传递给该函数。 - 生成的模型全部由
models/index.js
导出。
似乎智能感知不理解这一点,并且无法从这些由函数创建的导出中跟踪类方法。
以下是 Sequelize CLI 将为与上述示例完全相同的模型创建的 User.js
文件:
"use strict";
const { Model } = require("sequelize");
module.exports = (sequelize,DataTypes) => {
class User extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here
}
}
User.init(
{
firstName: DataTypes.STRING,lastName: DataTypes.STRING
},{
sequelize,modelName: "User"
}
);
return User;
};
为了智能感知,我更愿意(或多或少)使用第一个示例所证明的结构:导出类,不函数。我可能会在某个单独的文件中实例化 sequelize
,但随后会在我的各种模型定义中多次实例化该文件。
这是个坏主意吗?我会在不知不觉中制造一些相互竞争的连接的杂音吗?我需要担心任何副作用吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)