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

使用“apollo-server-azure-functions”的 Apollo 订阅

Apollo-Server,如何与 SailsJS 一起使用?