javascript - 无法在 Nest.js 框架中将 TypeORM 连接到 Heroku Postgres 数据库
问题描述
尝试将 Nest.js API 连接到数据库时遇到问题。当我使用本地数据库时工作正常。
我的数据库部署在 Heroku 服务器上,我可以使用 pgadmin 访问它。
我正在使用带有 .env 文件的 TypeORM 进行配置。
.env 示例:
NODE_TLS_REJECT_UNAUTHORIZED=0
TYPEORM_CONNECTION=postgres
TYPEORM_HOST=***
TYPEORM_USERNAME=***
TYPEORM_PASSWORD=***
TYPEORM_DATABASE=***
TYPEORM_PORT=5432
TYPEORM_DRIVER_EXTRA='{"ssl":true}'
TYPEORM_SYNCHRONIZE=false
TYPEORM_ENTITIES=dist/**/*.entity.js
TYPEORM_MIGRATIONS=dist/v1/migration/*.js
TYPEORM_MIGRATIONS_DIR=src/v1/migration
TYPEORM_MIGRATIONS_RUN=true
运行 npm run start:dev cmd 返回此错误
[Nest] 14998 - 2020-04-01 17:02:42 [TypeOrmModule] Unable to connect to the database. Retrying (1)... +712ms
QueryFailedError: syntax error at or near "`"
at new QueryFailedError (/home/primeradiant/Documents/hitema/agorise/projet/easymove-api/node_modules/typeorm/error/QueryFailedError.js:11:28)
at Query.callback (/home/primeradiant/Documents/hitema/agorise/projet/easymove-api/node_modules/typeorm/driver/postgres/PostgresQueryRunner.js:176:38)
at Query.handleError (/home/primeradiant/Documents/hitema/agorise/projet/easymove-api/node_modules/pg/lib/query.js:138:19)
at Connection.connectedErrorMessageHandler (/home/primeradiant/Documents/hitema/agorise/projet/easymove-api/node_modules/pg/lib/client.js:223:17)
at Connection.emit (events.js:210:5)
at TLSSocket.<anonymous> (/home/primeradiant/Documents/hitema/agorise/projet/easymove-api/node_modules/pg/lib/connection.js:120:12)
at TLSSocket.emit (events.js:210:5)
at addChunk (_stream_readable.js:308:12)
at readableAddChunk (_stream_readable.js:289:11)
at TLSSocket.Readable.push (_stream_readable.js:223:10)
我不知道该错误是否是由于错误的凭据引起的。有可能是我没看懂一点。谢谢您的帮助
编辑:问题来自 TYPEORM_MIGRATIONS_RUN 设置为 true,如果我将其设置为 false,则 api 构建成功
或者来自自动迁移生成的查询文件
import {MigrationInterface, QueryRunner} from "typeorm";
export class BaseHistory1584471283256 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query("DROP INDEX `IDX_97672ac88f789774dd47f7c8be` ON `users`");
await queryRunner.query("CREATE TABLE `history` (`id` int NOT NULL AUTO_INCREMENT, `price` varchar(255) NOT NULL, `departure_station` varchar(255) NOT NULL, `created_at` datetime NOT NULL DEFAULT NOW(), `userId` varchar(255) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB");
await queryRunner.query("ALTER TABLE `users` DROP COLUMN `createdAt`");
await queryRunner.query("ALTER TABLE `users` DROP COLUMN `updatedAt`");
await queryRunner.query("ALTER TABLE `users` ADD `created_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6)");
await queryRunner.query("ALTER TABLE `users` ADD `updated_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6)");
await queryRunner.query("ALTER TABLE `users` ADD UNIQUE INDEX `IDX_97672ac88f789774dd47f7c8be` (`email`)");
await queryRunner.query("ALTER TABLE `history` ADD CONSTRAINT `FK_7d339708f0fa8446e3c4128dea9` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE");
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query("ALTER TABLE `history` DROP FOREIGN KEY `FK_7d339708f0fa8446e3c4128dea9`");
await queryRunner.query("ALTER TABLE `users` DROP INDEX `IDX_97672ac88f789774dd47f7c8be`");
await queryRunner.query("ALTER TABLE `users` DROP COLUMN `updated_at`");
await queryRunner.query("ALTER TABLE `users` DROP COLUMN `created_at`");
await queryRunner.query("ALTER TABLE `users` ADD `updatedAt` datetime(6) NOT NULL DEFAULT 'CURRENT_TIMESTAMP(6)'");
await queryRunner.query("ALTER TABLE `users` ADD `createdAt` datetime(6) NOT NULL DEFAULT 'CURRENT_TIMESTAMP(6)'");
await queryRunner.query("DROP TABLE `history`");
await queryRunner.query("CREATE INDEX `IDX_97672ac88f789774dd47f7c8be` ON `users` (`email`)");
}
}
解决方案
Postgres 不将 ` 识别为有效的字符串字符。相反,'
应该使用。您可以在此处阅读有关 postgres 字符串的更多信息
推荐阅读
- html - 无法在字符串 Angular 上创建属性
- python - 我的json作为输出字符串而不是python中的int
- postgresql - 比较 postgreSQL 表中的行并保留列中字符串最长的行
- python-3.x - 基于Python中的两个数据框计算总加权分数
- jmeter - 分布式负载测试jmeter
- java - 线程未按顺序存储在集合中
- azure - ARM 模板 - 订阅读者和 Azure 资源参与者角色(然后使用蓝图分配)
- javascript - 反应状态值在本机事件的回调中为空
- javascript - Angular 在运行时创建元素,同时保持样式
- localization - 如何为本地化创建和加载 resource.dll?