Jen*_*mes 13 node.js sequelize.js typescript
Sequelize 文档声称它可以与 Typescript 一起使用,但为了使其在生产中有用,需要使用数据库迁移脚本。这些只能使用 Sequelize CLI 执行,但这个 CLI 似乎根本不考虑 Typescript。它只生成(并且显然运行)JS 文件。NPM 上有一个“sequelize-cli-typescript”项目,但已经有 4 年历史了!Stack Overflow 上对相关问题的唯一答案实际上有 6 个字长,但没有一个有用:Using Sequelize cli with TypeScript
我的设置是这样的:
我使用 Typescript 创建了一个基本的 Node 应用程序,tsconfig.js
如下所示:
{
"compilerOptions": {
"allowJs": true,
"module": "commonjs",
"esModuleInterop": true,
"target": "es6",
"noImplicitAny": true,
"moduleResolution": "node",
"sourceMap": true,
"outDir": "dist",
"baseUrl": ".",
"paths": {
"*": [
"node_modules/*"
]
}
},
"include": [
"*"
]
}
Run Code Online (Sandbox Code Playgroud)
我还将 ESLint 与以下内容一起使用.eslintrc
:
{
"root": true,
"parser": "@typescript-eslint/parser",
"plugins": [
"@typescript-eslint"
],
"extends": [
"airbnb-base", "airbnb-typescript/base"
],
"parserOptions": {
"project": "./tsconfig.json"
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我尝试运行 Sequelize CLI init 命令,npx sequelize-cli init
如数据库迁移文档中所述。models/index.js
这导致创建一个包含以下内容的文件:
'use strict';
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};
let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
sequelize = new Sequelize(config.database, config.username, config.password, config);
}
fs
.readdirSync(__dirname)
.filter(file => {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
})
.forEach(file => {
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
db[model.name] = model;
});
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
Run Code Online (Sandbox Code Playgroud)
这会导致我的 IDE(VS Code)显示错误:
解析错误:已为 @typescript-eslint/parser 设置“parserOptions.project”。该文件与您的项目配置不匹配:models/index.js。该文件必须至少包含在所提供的项目之一中。
我不知道这是什么意思。我读过很多解释,但没有一个对我来说有意义。我在 tsconfig 中将 allowedJs 设置为 true 并包含所有内容。我缺少什么?更重要的是,如何使用 Typescript 进行数据库迁移和 CLI 生成的代码?
Ana*_*oly 14
至于用于连接数据库和注册模型的生成代码,您应该手动将其转换为 ts (通常是一次性的事情)。
至于迁移,我使用以下解决方法:
.sequelizerc
到 TS 将放置编译的应用程序的文件夹中的子文件夹(这对于能够在测试和生产环境中应用迁移非常重要),如下所示:const { resolve } = require('path');
module.exports = {
config: resolve('build/application/config.js'),
'seeders-path': resolve('build/application/seeders'),
'migrations-path': resolve('build/application/migrations'),
'models-path': resolve('application/models')
};
Run Code Online (Sandbox Code Playgroud)
sequelize migration:create --name add-some-table
Run Code Online (Sandbox Code Playgroud)
application/migrations
并将其扩展名更改为.ts
import { QueryInterface, DataTypes, QueryTypes } from 'sequelize';
/** @type {import("sequelize-cli").Migration} */
module.exports = {
up: (queryInterface: QueryInterface): Promise<void> => queryInterface.sequelize.transaction(
async (transaction) => {
// here go all migration changes
}
),
down: (queryInterface: QueryInterface): Promise<void> => queryInterface.sequelize.transaction(
async (transaction) => {
// here go all migration undo changes
}
)
};
Run Code Online (Sandbox Code Playgroud)
基本上,可以编写一些脚本文件来简单地生成.ts
迁移文件,直接使用给定名称复制文件夹中的预定义模板文件,application/migrations
将步骤 2-4 合并为一个步骤。
如果您最终想出更好的解决方案,请随时在评论中分享,甚至可以在此处作为单独的答案。
UPD。从 v6.5.2 Sequelize CLI 开始,具有类型声明,可以帮助推断 props 并使用 IDE 提示等(请参阅上面更新的代码)
归档时间: |
|
查看次数: |
21991 次 |
最近记录: |