首页 > 解决方案 > 在节点中使用 Typescript 正确解析 GraphQL 模块

问题描述

在创建一个简单的 TypeScript 项目来制作 GraphQL 服务器时,我想将*.graphql文件直接导入到我的代码中,例如schema.graphql. 我已遵循有关模块声明的所有指示,以便可以进行此类导入。

VS Code 没有显示任何错误,但是 TSC 无法解决:

$ yarn tsc && node dist/index.js
yarn run v1.22.4
$ /home/arsleust/seedbox/back/node_modules/.bin/tsc
Done in 2.15s.
internal/modules/cjs/loader.js:638
    throw err;
    ^

Error: Cannot find module './graphql/schema.graphql'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
    at Function.Module._load (internal/modules/cjs/loader.js:562:25)
    at Module.require (internal/modules/cjs/loader.js:692:17)
    at require (internal/modules/cjs/helpers.js:25:18)
    at Object.<anonymous> (/home/arsleust/seedbox/back/dist/index.js:7:42)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)

我的项目:

{
    "name": "app",
    "version": "1.0.0",
    "dependencies": {
        "apollo-server": "2.14.1",
        "graphql": "15.0.0",
        "graphql-tools": "6.0.5",
        "nodemon": "2.0.4",
        "ts-node": "8.10.2",
        "typescript": "3.9.3"
    }
}
{
    "compilerOptions": {
        "target": "esnext",
        "module": "commonjs",
        "esModuleInterop": true,
        "typeRoots": ["./node_modules/@types", "./@types"],
        "outDir": "dist",
        "sourceMap": true
    },
    "include": ["src", "./@types"],
    "exclude": ["node_modules", "dist"]
}
declare module '*.graphql' {
    import { DocumentNode } from 'graphql';
    const Schema: DocumentNode;

    export = Schema;
}
import { ApolloServer } from 'apollo-server';
import typeDefs from './graphql/schema.graphql';

// Provide resolver functions for your schema fields
const resolvers = {
    Query: {
        hello: () => `Say hello to the new Apollo Server!`,
    },
};

const server = new ApolloServer({ typeDefs, resolvers });

server.listen().then(({ url }) => {
    console.log(`Server ready at ${url}`);
});
type Query {
    hello: String!
}

当我查看时,tsc --traceResolution我得到:

======== Resolving module './graphql/schema.graphql' from '/home/arsleust/seedbox/back/src/index.ts'. ========
Explicitly specified module resolution kind: 'NodeJs'.
Loading module as file / folder, candidate module location '/home/arsleust/seedbox/back/src/graphql/schema.graphql', target file type 'TypeScript'.
File '/home/arsleust/seedbox/back/src/graphql/schema.graphql.ts' does not exist.
File '/home/arsleust/seedbox/back/src/graphql/schema.graphql.tsx' does not exist.
File '/home/arsleust/seedbox/back/src/graphql/schema.graphql.d.ts' does not exist.
Directory '/home/arsleust/seedbox/back/src/graphql/schema.graphql' does not exist, skipping all lookups in it.
Loading module as file / folder, candidate module location '/home/arsleust/seedbox/back/src/graphql/schema.graphql', target file type 'JavaScript'.
File '/home/arsleust/seedbox/back/src/graphql/schema.graphql.js' does not exist.
File '/home/arsleust/seedbox/back/src/graphql/schema.graphql.jsx' does not exist.
Directory '/home/arsleust/seedbox/back/src/graphql/schema.graphql' does not exist, skipping all lookups in it.
======== Module name './graphql/schema.graphql' was not resolved. ========

标签: typescriptgraphqlapollo

解决方案


推荐阅读