Apollo Server,datasource-sql 子类未被识别为有效的 DataSource 类型
Posted
技术标签:
【中文标题】Apollo Server,datasource-sql 子类未被识别为有效的 DataSource 类型【英文标题】:Apollo Server, datasource-sql sub-class not being recognised as a valid DataSource type 【发布时间】:2021-06-20 16:27:18 【问题描述】:我正在将 Typescript 添加到现有的 Nodejs Apollo Server 项目中,并且在使用 datasource-sql 库时遇到了一些问题。
我的 sql 客户端类简化...
import SQLDataSource from "datasource-sql";
export default class CtlDatabase extends SQLDataSource
...
并在我设置 Apollo 服务器数据源的主 index.ts 文件中引用...
import CtlDatabase from './dataSources/CtlDatabase';
...
const dataSources = (): DataSources<Context['dataSources']> =>
return
ctlDatabase: new CtlDatabase(config),
;
Typescript 似乎根本没有继承 SQLDataSource,它甚至显示了与在构造函数中传递配置相关的问题;即使根据 SQLDataSource 定义,这是有效的语法。
https://github.com/cvburgess/SQLDataSource/blob/master/index.js
您可以看到 SQLDataSource 类也扩展了 DataSource 类。
这里是错误-
类型“CtlDatabase”与类型“DataSource'。
并表明它缺乏对 SQLDataSource 类的了解
预期 0 个参数,但得到 1 个。
我的 sql 客户端包中关于导入定义的错误 -
找不到模块“datasource-sql”的声明文件。 '/home/russjb/Work/codeforaustralia/CBC-Backend/node_modules/datasource-sql/index.js' 隐含了一个 'any' 类型。
我该如何解决这个问题? 我必须为那个包定义我自己的类型吗? 我该怎么做?
tsconfig.json
"$schema": "https://json.schemastore.org/tsconfig",
"display": "Node 14",
"compilerOptions":
"outDir": "build/",
"lib": ["es2020"],
"module": "CommonJS",
"target": "es2020",
"allowJs": true,
"strict": true,
"noImplicitAny": false,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"skipLibCheck": true,
"resolveJsonModule": true,
"forceConsistentCasingInFileNames": true
,
"include": ["./src/**/*"]
非常感谢任何帮助! TypeScript 新手,所以它是一个学习曲线。
FWIW 我也在使用 apollo rest 数据源,没有任何问题。
【问题讨论】:
【参考方案1】:您正在继承,但 CtlDatabase 构造函数没有参数。
您应该在 CtlDatabase 构造函数中接收一个参数,然后调用 super(config) 导出默认类 CtlDatabase 扩展 SQLDataSource 构造函数(配置:任何) 超级(配置); //代码在这里
【讨论】:
构造函数继承自 SQLDataSource 类,我的类中没有定义。创建实例时,我确实将配置传递给构造函数。我想出了一个解决方案并将其发布。【参考方案2】:我找到了解决问题的方法;没有datasource-sql
模块的任何 TS 定义,TypeScript 只是像 any 一样继承它,因此它看不到 DataSource 的进一步继承,它甚至没有识别从模块导出的类。
要解决这个问题,我必须为模块添加我自己的 TypeScript 声明文件 (.d.ts
),请点击此处 -
https://medium.com/@chris_72272/migrating-to-typescript-write-a-declaration-file-for-a-third-party-npm-module-b1f75808ed2
我的声明文件datasource-sql.d.ts
declare module 'datasource-sql'
export class SQLDataSource
constructor(knexConfig?: any);
initialize?(config: DataSourceConfig<TContext>): void;
knex: any;
;
它并不漂亮,它只做了我需要的最低限度的工作。 下一步是正确设置 knex 属性,以便我的包更加了解 knex 可以做的所有事情。
还将它添加到我的主索引文件的顶部 -
/// <reference path="./dataSources/CtlDatabase/datasource-sql.d.ts"/>
它一点也不漂亮,但它让我向前迈进了。
【讨论】:
以上是关于Apollo Server,datasource-sql 子类未被识别为有效的 DataSource 类型的主要内容,如果未能解决你的问题,请参考以下文章
Apollo Server:dataSources vs context 与数据库一起使用
获取 apollo-rest-datasource 发布请求的 Response-Body
使用 apollo-datasource-rest 库将 Content-Type 标头设置为 application/x-www-form-urlencoded
[Apollo Server] Get started with Apollo Server