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生成的代码?
2条答案
按热度按时间0x6upsns1#
至于生成的连接到DB和注册模型的代码,您应该手动将其转换为ts(通常是一次性的)。
对于迁移,我使用以下解决方法:
1.在
.sequelizerc
中配置迁移路径,使其指向TS将放置已编译应用程序的文件夹中的子文件夹(这一点非常重要,以便能够在测试和生产环境中应用迁移),例如:1.生成具有给定名称的迁移文件:
1.将生成的文件移动到
application/migrations
并将其扩展名更改为.ts
1.用某种迁移Typescript-template替换文件的内容:
1.向迁移文件添加必要的更改
基本上,可以编写一些脚本文件来简单地生成
.ts
迁移文件,直接使用给定的名称复制application/migrations
文件夹中的预定义模板文件,以将步骤2-4合并为单个步骤。如果你最终会想出一个更好的解决方案,请随时在评论中分享,甚至作为一个单独的答案在这里。
6ju8rftf2#
当我将配置文件更改为.ts时,我遇到了配置文件问题,我创建了.sequelizerc文件并添加了config.ts文件名以接受ts文件配置。当我们执行sequelize.sync()方法时,这是有效的。但在执行Sequlize迁移时,它不适用于.TS配置文件。当我将其更改为.JS时,它开始工作。