NodeJS 使用Typescript按顺序执行CLI和DB迁移

bvk5enib  于 2023-03-01  发布在  Node.js
关注(0)|答案(2)|浏览(116)

Sequelize文档声称它可以与Typescript一起工作,但为了使它在生产中有用,需要使用DB迁移脚本。这些脚本只能使用Sequelize CLI执行,但此CLI似乎根本不考虑Typescript。它只生成(显然运行)JS文件。NPM上有一个"sequelize-cli-typescript"项目,但它已经4年了!而在Stack Overflow上对一个相关问题的唯一答案就是字面上的6个单词长,没有一个是有用的:Using sequelize cli with typescript
我的设置是这样的:
我用Typescript和一个简单的tsconfig.js创建了一个基本的Node应用程序,如下所示:

{
  "compilerOptions": {
    "allowJs": true,
    "module": "commonjs",
    "esModuleInterop": true,
    "target": "es6",
    "noImplicitAny": true,
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist",
    "baseUrl": ".",
    "paths": {
      "*": [
        "node_modules/*"
      ]
    }
  },
  "include": [
    "*"
  ]
}

我还将ESLint用于以下.eslintrc

{
  "root": true,
  "parser": "@typescript-eslint/parser",
  "plugins": [
    "@typescript-eslint"
  ],
  "extends": [
    "airbnb-base", "airbnb-typescript/base"
  ],
  "parserOptions": {
    "project": "./tsconfig.json"
  }
}

然后,我尝试运行Sequelize CLI init命令npx sequelize-cli init,如DB迁移文档中所述,这导致创建了一个包含以下内容的文件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;

这导致我的IDE(VS代码)显示错误:
解析错误:已为@typescript-eslint/parser设置了"parserOptions. project"。该文件与您的项目配置不匹配:models/index.js。该文件必须包含在提供的至少一个项目中。
我不知道这是什么意思。我读了很多解释,但没有一个对我有意义。我在tsconfig中将allowJs设置为true,并包含所有内容。我遗漏了什么?更重要的是,我如何使用Typescript进行数据库迁移和CLI生成的代码?

0x6upsns

0x6upsns1#

至于生成的连接到DB和注册模型的代码,您应该手动将其转换为ts(通常是一次性的)。
对于迁移,我使用以下解决方法:
1.在.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')
};

1.生成具有给定名称的迁移文件:

sequelize migration:create --name add-some-table

1.将生成的文件移动到application/migrations并将其扩展名更改为.ts
1.用某种迁移Typescript-template替换文件的内容:

import { QueryInterface, DataTypes, QueryTypes } from 'sequelize';

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

1.向迁移文件添加必要的更改
基本上,可以编写一些脚本文件来简单地生成.ts迁移文件,直接使用给定的名称复制application/migrations文件夹中的预定义模板文件,以将步骤2-4合并为单个步骤。
如果你最终会想出一个更好的解决方案,请随时在评论中分享,甚至作为一个单独的答案在这里。

6ju8rftf

6ju8rftf2#

当我将配置文件更改为.ts时,我遇到了配置文件问题,我创建了.sequelizerc文件并添加了config.ts文件名以接受ts文件配置。当我们执行sequelize.sync()方法时,这是有效的。但在执行Sequlize迁移时,它不适用于.TS配置文件。当我将其更改为.JS时,它开始工作。

相关问题