node.js - Fel vid körning av sequelize seeder på en TypeScript-baserad setup
Jag vill använda sequelize seeders och migrationer på mitt express API och för närvarande är alla modeller skrivna i TypeScript med hjälp av sequelize-typescript
Jag försökte lägga till min första seeder-fil med TypeScript och jag får ett fel när jag kör den
20221028050116-feeds.ts seed-fil
'use strict';
import { QueryInterface } from 'sequelize';
const feedTypes = [
{ id: 'b871a455-fddb-414c-ac02-2cdee07fa671', name: 'crypto' },
{ id: '68b15f90-19ca-4971-a2c6-67e66dc88f77', name: 'general' },
];
const feeds = [
{
id: 1,
name: 'cointelegraph',
url: 'https://cointelegraph.com/rss',
feed_type_id: 'b871a455-fddb-414c-ac02-2cdee07fa671',
},
];
module.exports = {
up: (queryInterface: QueryInterface): Promise<number | object> =>
queryInterface.sequelize.transaction(async (transaction) => {
// here go all migration changes
return Promise.all([
queryInterface.bulkInsert('feed_types', feedTypes, { transaction }),
queryInterface.bulkInsert('feeds', feeds, { transaction }),
]);
}),
down: (queryInterface: QueryInterface): Promise<object | object> =>
queryInterface.sequelize.transaction(async (transaction) => {
// here go all migration undo changes
return Promise.all([
queryInterface.bulkDelete('feed_types', null, { transaction }),
queryInterface.bulkDelete('feeds', null, { transaction }),
]);
}),
};
Jag lade till 2 kommandon i min package.json-fil för att så
"apply-seeders": "sequelize-cli db:seed:all",
"revert-seeders": "sequelize-cli db:seed:undo:all",
När jag kör 'npm run apply-seeders' får jag följande fel
Sequelize CLI [Node: 16.17.0, CLI: 6.5.1, ORM: 6.23.2]
ERROR: Cannot find "/Users/vr/Desktop/code/ch/api/src/config/index.js". Have you run "sequelize init"?
ERROR: Cannot read properties of undefined (reading 'detail')
sequelize-cli db:seed:all
Run every seeder
Options:
--version Show version number [boolean]
--help Show help [boolean]
--env The environment to run the command in [string] [default: "development"]
--config The path to the config file [string]
--options-path The path to a JSON file with additional options [string]
--migrations-path The path to the migrations folder [string] [default: "migrations"]
--seeders-path The path to the seeders folder [string] [default: "seeders"]
--models-path The path to the models folder [string] [default: "models"]
--url The database connection string to use. Alternative to using --config files [string]
--debug When available show various debug information [boolean] [default: false]
TypeError: Cannot read properties of undefined (reading 'detail')
at Object.error (/Users/vr/Desktop/code/ch/api/node_modules/sequelize-cli/lib/helpers/view-helper.js:43:24)
at /Users/vr/Desktop/code/ch/api/node_modules/sequelize-cli/lib/commands/seed.js:48:39
at async Object.exports.handler (/Users/vr/Desktop/code/ch/api/node_modules/sequelize-cli/lib/commands/seed.js:24:7)
vr@vivz api %
Jag grävde lite i det och det visar sig att du inte kan köra TypeScript-filer direkt med Sequelize enligt DETTA SVAR här
Jag ändrade min .sequelizerc-fil för att köra saker från dist-mappen istället för src
.sequelizerc-fil
require("@babel/register");
const path = require('path');
module.exports = {
config: path.resolve('dist', 'config', 'index.js'),
'migrations-path': path.resolve('dist', 'data', 'migrations'),
'models-path': path.resolve('dist', 'data', 'models'),
'seeders-path': path.resolve('dist', 'data', 'seeders'),
};
Att köra detta nu ger mig en annan typ av fel
Sequelize CLI [Node: 16.17.0, CLI: 6.5.1, ORM: 6.23.2]
ERROR: Error reading "dist/config/index.js". Error: Error: Cannot find module 'babel-plugin-module-resolver'
Require stack:
- /Users/vr/Desktop/code/ch/api/node_modules/@babel/core/lib/config/files/plugins.js
- /Users/vr/Desktop/code/ch/api/node_modules/@babel/core/lib/config/files/index.js
- /Users/vr/Desktop/code/ch/api/node_modules/@babel/core/lib/index.js
- /Users/vr/Desktop/code/ch/api/node_modules/@babel/register/lib/worker/babel-core.js
- /Users/vr/Desktop/code/ch/api/node_modules/@babel/register/lib/worker/handle-message.js
- /Users/vr/Desktop/code/ch/api/node_modules/@babel/register/lib/worker-client.js
- /Users/vr/Desktop/code/ch/api/node_modules/@babel/register/lib/node.js
- /Users/vr/Desktop/code/ch/api/node_modules/@babel/register/lib/nodeWrapper.js
- /Users/vr/Desktop/code/ch/api/node_modules/@babel/register/lib/index.js
- /Users/vr/Desktop/code/ch/api/.sequelizerc
- /Users/vr/Desktop/code/ch/api/node_modules/sequelize-cli/lib/core/yargs.js
- /Users/vr/Desktop/code/ch/api/node_modules/sequelize-cli/lib/sequelize
ERROR: Cannot read properties of undefined (reading 'detail')
sequelize-cli db:seed:all
Run every seeder
Options:
--version Show version number [boolean]
--help Show help [boolean]
--env The environment to run the command in [string] [default: "development"]
--config The path to the config file [string]
--options-path The path to a JSON file with additional options [string]
--migrations-path The path to the migrations folder [string] [default: "migrations"]
--seeders-path The path to the seeders folder [string] [default: "seeders"]
--models-path The path to the models folder [string] [default: "models"]
--url The database connection string to use. Alternative to using --config files [string]
--debug When available show various debug information [boolean] [default: false]
TypeError: Cannot read properties of undefined (reading 'detail')
at Object.error (/Users/vr/Desktop/code/ch/api/node_modules/sequelize-cli/lib/helpers/view-helper.js:43:24)
at /Users/vr/Desktop/code/ch/api/node_modules/sequelize-cli/lib/commands/seed.js:48:39
at async Object.exports.handler (/Users/vr/Desktop/code/ch/api/node_modules/sequelize-cli/lib/commands/seed.js:24:7)
Detta skulle vara min tsconfig.json-fil
{
"compilerOptions": {
"lib": ["es2020"],
"module": "commonjs",
"moduleResolution": "node",
"target": "es2020",
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"noImplicitAny": false,
"outDir": "dist",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"baseUrl": ".",
"paths": {
"server/*": ["src/server/*"],
"tests/*": ["src/tests/*"],
"data/*": ["src/data/*"],
"config": ["src/config"],
}
}
}
Kan någon snällt berätta för mig hur jag kan köra mina seeder- och migrationsfiler med TypeScript
UPPDATERING 1
Jag installerade babel-plugin-module-resolver. Nu ger det mig ett nytt fel. Detta fel visas inte om du kör ts-filerna normalt. När jag använder console.log kan jag se alla värden, men när programmet körs verkar det som att det dialektet helt enkelt inte laddar det från env-filen.
Loaded configuration file "dist/config/index.js".
ERROR: Dialect needs to be explicitly supplied as of v4.0.0
ERROR: Cannot read properties of undefined (reading 'detail')
UPPDATERING 2
Jag har hårdkodat dialekten postgres i konfigurationsfilen och den ger mig fortfarande felet. Jag har till och med verifierat att den transpilerade js-filen har postgres-dialekten specificerad
Svar #1
Jag lyckades få saker att fungera
Din .sequelizerc och config/index.ts kan absolut inte ha import export verkar det som
Här är min /.sequelizerc
require("@babel/register");
const path = require('path');
module.exports = {
config: path.resolve('dist', 'config', 'index.js'),
'migrations-path': path.resolve('dist', 'data', 'migrations'),
'models-path': path.resolve('dist', 'data', 'models'),
'seeders-path': path.resolve('dist', 'data', 'seeders'),
};
Här är min /src/config/index.ts
const config: any = {
// if we are running tests we use an in memory db with sqlite
dialect: process.env.DB_DIALECT,
username: process.env.POSTGRES_USER,
password: process.env.POSTGRES_PASSWORD,
database: process.env.POSTGRES_DB,
host: process.env.POSTGRES_HOST,
port: Number(process.env.POSTGRES_PORT),
define: {
underscored: true,
},
logging: false,
};
module.exports = config;
Och jag inkluderar en enda seedare här
Här är min /src/data/seeders/20221116042655-feeds.ts
import { QueryInterface } from 'sequelize';
import { feedTypes, feeds } from './fixtures';
const down = (queryInterface: QueryInterface): Promise<object | object> =>
queryInterface.sequelize.transaction(async (transaction) => {
// here go all migration undo changes
return Promise.all([
queryInterface.bulkDelete('feed_types', null, { transaction }),
queryInterface.bulkDelete('feeds', null, { transaction }),
]);
});
const up = (queryInterface: QueryInterface): Promise<number | object> =>
queryInterface.sequelize.transaction(async (transaction) => {
// here go all migration changes
return Promise.all([
queryInterface.bulkInsert('feed_types', feedTypes, {
transaction,
// @ts-ignore
ignoreDuplicates: true,
}),
queryInterface.bulkInsert('feeds', feeds, {
transaction,
// @ts-ignore
ignoreDuplicates: true,
}),
queryInterface.sequelize.query(
`SELECT setval('feeds_id_seq', (SELECT MAX(id) FROM feeds))`,
{ transaction },
),
]);
});
export { down, up };
Prioriteringsordningen för operationer är mycket viktig här
Skapa erforderliga seeders
npx sequelize-cli seed:generate --name feeds npx sequelize-cli seed:generate --name tag_rules npx sequelize-cli seed:generate --name usersByt filtillägget på varje genererad js-fil till ts
Ändra
.sequelizercför att läsa transpilerade js-filer fråndistInstallera babel-plugin-module-resolver
npm i --save-dev babel-plugin-module-resolver
Alla seeder-filer använder import/export och de enda filer som använder require och module.exports är .sequelizerc och konfigurationsfilen
Om någon vet hur man får dessa att fungera med import/export-syntaxen, känn dig fri att föreslå.
Så här ser mitt seed-kommando inuti package.json ut
"apply-seeders": "node -r dotenv-flow/config ./node_modules/.bin/sequelize db:seed:all",
"revert-seeders": "node -r dotenv-flow/config ./node_modules/.bin/sequelize db:seed:undo:all",
Svar #2
Jag hade samma problem när jag körde sequelize-kommandot, som var installerat globalt. Det var ett konstigt problem eftersom det fungerade på andra projekt (inte TypeScript-projekt).
Den här gången försökte jag installera sequelize lokalt och köra dem med "npx". Och det fungerar utmärkt igen. Till exempel:
npm install --save-dev sequelize
npx sequelize db:migrate
npx sequelize db:migrate:status
Mitt system var node 18.10, sequelize 6.25.5, pg 8.8.0.
