【问题标题】:Netlify Function cannot import relative .graphql type definition fileNetlify 函数无法导入相关的 .graphql 类型定义文件
【发布时间】:2020-08-27 15:51:27
【问题描述】:

我刚刚将 Node.js GraphQL API 从旧版本的 graphql-yoga + prisma 重写为使用 express、serverless-http、prisma 和 apollo-server-express。我已经让它作为 Express 应用程序在本地正常工作,但是当我尝试将它作为函数发布在 Netlify 上时,我收到“找不到模块”错误:

{
"errorType": "Runtime.ImportModuleError",
"errorMessage": "Error: Cannot find module './schema.graphql'\nRequire stack:\n- /var/task/bundle/index.js\n- /var/task/graphql.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
"trace": [
"Runtime.ImportModuleError: Error: Cannot find module './schema.graphql'",
"Require stack:",
"- /var/task/bundle/index.js",
"- /var/task/graphql.js",
"- /var/runtime/UserFunction.js",
"- /var/runtime/index.js",
"    at _loadUserApp (/var/runtime/UserFunction.js:100:13)",
"    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
"    at Object.<anonymous> (/var/runtime/index.js:43:30)",
"    at Module._compile (internal/modules/cjs/loader.js:1156:30)",
"    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1176:10)",
"    at Module.load (internal/modules/cjs/loader.js:1000:32)",
"    at Function.Module._load (internal/modules/cjs/loader.js:899:14)",
"    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)",
"    at internal/main/run_main_module.js:18:47"
]
}

我尝试了多种方法来导入这些 graphql 文件(graphql-imports、require.resolve、fs.readDirSync 等),但要么根本不起作用,要么只能从项目根目录起作用。 require.resolve 在本地项目根目录下工作,所以我认为这个文件只是没有包含在构建中。我怎么知道是什么被压缩了?

我的 netlify.toml 是:

[build]
  command = "npm run bundle"
  functions = "functions"

npm run bundle 基本上是cpx 'src/**/*' 'functions/bundle',并且文件在functions/bundle/schema.graphqlfunctions/bundle/generated/prisma.graphql 中本地可见。

我的functions/graphql.js 只是使用 Express 服务器并创建一个 lambda 包装器:

const serverlessHttp = require("serverless-http");

const { app } = require("./bundle/index.js");

exports.handler = serverlessHttp(app, {
  request(req, event, context) {
    req.event = event;
    req.context = context;
  }
});

"graphql-import" 非常烦人,因为它只适用于项目的根目录,因此将 src/ 文件复制到 functions/bundle/ 会更改目录结构,并且这些导入不再起作用 在functions/bundle/index.js里面,我尝试require.resolve一些.grapqhl类型定义文件:

const { importSchema } = require("graphql-import");

const typeDefs = importSchema(require.resolve("./schema.graphql"));
const prismaTypeDefs = importSchema(
  require.resolve("./generated/prisma.graphql")
);

const db = new Prisma({
  typeDefs: prismaTypeDefs,
  endpoint: process.env.PRISMA_ENDPOINT,
  secret: process.env.PRISMA_SECRET,
  debug: process.env.NODE_ENV === "development"
});

const schema = makeExecutableSchema({
  typeDefs: gql`
    ${typeDefs}
  `,
  resolvers: {
    Mutation,
    Query,
  },
  resolverValidationOptions: { requireResolversForResolveType: false }
});

同样,这在本地工作,所以我假设该文件完全从压缩文件中丢失。

我很茫然。有什么想法吗?

【问题讨论】:

    标签: lambda graphql apollo-server netlify prisma


    【解决方案1】:

    您是否尝试过通过netlify functions:invoke 使用netlify 环境在本地进行测试?它可以帮助调试此类问题。 (见https://github.com/netlify/cli/blob/master/docs/netlify-dev.md#locally-testing-functions-with-netlify-functionsinvoke

    关于您的问题,您似乎已经建议忽略某些文件:

    Netlify 将访问函数目录 在每次部署期间,将每个受支持的代码文件压缩和部署为 AWS 上的无服务器 Lambda 函数。 (请注意,除了一个例外, 子目录中的任何文件都将被忽略。)

    要使用多个文件,你需要在你的functions文件夹中定义一个带有函数名和js的文件夹,否则它只会考虑.js文件:

    您可以使用导出处理程序的独立 .js 文件(例如 functions/{function_name}.js) 或与 .js 同名的文件夹 在其中导出处理程序的文件(例如 函数/{function_name}/{function_name}.js)。

    确保使用相对导入或考虑完整路径。

    您还可以尝试从 CLI 版本 2.7.0 开始部署未捆绑的 JavaScript。见:https://docs.netlify.com/cli/get-started/#unbundled-javascript-function-deploys

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 2021-05-30
      • 2021-04-28
      • 2020-11-05
      • 2021-12-05
      • 2020-12-20
      • 2020-06-14
      • 2019-01-11
      • 2013-02-02
      相关资源
      最近更新 更多