【问题标题】:Apollo server didn't print errors on node consoleApollo 服务器没有在节点控制台上打印错误
【发布时间】:2019-11-11 08:32:01
【问题描述】:

我有一个 Apollo 服务器:

45 const server = new ApolloServer({
46   resolvers,
47   typeDefs, 
48   debug: true,
49 })

在客户端,我收到如下 js 错误:

扩展名:{code: "INTERNAL_SERVER_ERROR",…}
位置:[{line: 3, column: 7}]
0:{行:3,列:7}
消息:“无法读取未定义的属性‘拆分’”

但是运行服务器的节点控制台没有打印任何东西:

node:63865) DeprecationWarning:当前的 URL 字符串解析器已被弃用,并将在未来的版本中删除。要使用新的解析器,请将选项 { useNewUrlParser: true } 传递给 MongoClient.connect。 ???服务器准备就绪http://localhost:4001/ Mongoose 默认连接打开到 mongodb://localhost/gepick (节点:63865)DeprecationWarning:collection.ensureIndex 已弃用。请改用 createIndexes。 (节点:63865)[DEP0005] DeprecationWarning:由于安全性和可用性问题,不推荐使用 Buffer()。请改用 Buffer.alloc()、Buffer.allocUnsafe() 或 Buffer.from() 方法

【问题讨论】:

    标签: node.js graphql apollo apollo-server


    【解决方案1】:

    在解析字段期间发生的错误是执行错误。如您所见,除非您自己捕获错误,否则它将被 GraphQL 捕获并作为响应的一部分返回到 errors 数组中。因为错误被捕获,所以它永远不会出现在控制台中。

    只要 debug 选项设置为 true 并且您的 NODE_ENVdevelopment,返回的错误也将包括响应中的堆栈跟踪。您已截断帖子中的错误,但应在以下路径中找到堆栈跟踪:errors[0]extensions.exception.stacktrace

    返回的错误还应包括一个path 属性,该属性应指向发生问题的任何解析器。

    【讨论】:

    • Last time I tried this,堆栈跟踪仅指向 Apollo 内部,使得跟踪不是很有用。在此期间情况是否有所改善?
    • @DanDascalescu 如果它是与 Apollo 代码相关的错误(如在那种情况下),那么它将指向该代码。
    【解决方案2】:

    根据官方文档:https://www.apollographql.com/docs/apollo-server/data/errors/#for-the-client-response

    初始化ApoloServer时,添加formatError: (err) => {...}属性会打印出错误,见下图:

    const server = new ApolloServer({
      typeDefs,
      resolvers,
      formatError: (err) => {
        console.error(err);
        return err;
      },
    });
    

    【讨论】:

    • 编辑:它不起作用,因为我在错误的文件中设置了 formatError :) 您的答案是正确的,如果您没有明确设置此功能,则不会打印任何消息。令人惊讶的是,这在文档中不是很清楚,因为在开发中我们希望这种行为是默认的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多