You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apollo Server搭建报错:类型'() => void'无法赋值给'() => DataSources<object>'

解决Apollo Server dataSources的TypeScript类型问题

首先你代码里有明显的语法错误:dataSources 函数没有正确返回对象,得先把这个问题修正:

// 正确写法:返回包含数据源的对象
const dataSources = () => {
  return {
    quizzessApi: new QuizzessDataSource()
  };
};

// 或者用箭头函数简写形式
const dataSources = () => ({
  quizzessApi: new QuizzessDataSource()
});

接下来处理TypeScript的类型匹配问题,有两种常用方案:

方案一:手动定义数据源类型

先声明包含你的数据源的类型,再指定dataSources函数的返回类型,同时给ApolloServer传入上下文类型:

import { ApolloServer } from '@apollo/server';
import { DataSource } from 'apollo-datasource';

// 你的QuizzessDataSource和quizzessInterface定义...

// 定义自定义数据源类型
type AppDataSources = {
  quizzessApi: QuizzessDataSource;
};

// 指定dataSources的返回类型
const dataSources = (): AppDataSources => ({
  quizzessApi: new QuizzessDataSource()
});

// 给ApolloServer传入包含数据源的上下文类型
const server = new ApolloServer<{ dataSources: AppDataSources }>({ 
  typeDefs, 
  resolvers, 
  dataSources  
});
export default server.createHandler();

方案二:结合Apollo内置上下文类型

如果你用的是@apollo/server v4及以上版本,可以直接扩展BaseContext来定义上下文:

import { ApolloServer, BaseContext } from '@apollo/server';

// 定义包含数据源的上下文类型
interface AppContext extends BaseContext {
  dataSources: {
    quizzessApi: QuizzessDataSource;
  };
}

const dataSources = () => ({
  quizzessApi: new QuizzessDataSource()
});

// 传入自定义上下文类型给ApolloServer
const server = new ApolloServer<AppContext>({ 
  typeDefs, 
  resolvers, 
  dataSources  
});
export default server.createHandler();

另外注意:你的QuizzessDataSource里调用了this.findManyByQuery,但apollo-datasource的基础DataSource类并没有这个方法。如果是你自己扩展的功能,要确保方法已正确实现;如果是用特定数据源(比如MongoDB),应该继承对应数据源类(如MongoDataSource)而非基础DataSource。

内容的提问来源于stack exchange,提问作者Sumchans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:46:02