【问题标题】:Apollo 3, Meteor and "Cannot await without a Fiber"阿波罗 3 号、流星和“没有光纤就无法等待”
【发布时间】:2021-10-06 01:02:55
【问题描述】:

我几天来一直在努力更新我的 Meteor 应用程序以使用 Apollo 3。每次解析器访问 Mongo 时,我都会遇到一个非常令人沮丧的问题:

"stacktrace": [
  "AssertionError [ERR_ASSERTION] [ERR_ASSERTION]: Cannot await without a Fiber",
  "    at awaitPromise (/Users/Tim/.meteor/packages/promise/.0.12.0.acrhc3.4u34++os+web.browser+web.browser.legacy+web.cordova/npm/node_modules/meteor-promise/promise_server.js:75:12)",
  "    at Promise.await (/Users/Tim/.meteor/packages/promise/.0.12.0.acrhc3.4u34++os+web.browser+web.browser.legacy+web.cordova/npm/node_modules/meteor-promise/promise_server.js:60:12)",
  "    at SynchronousCursor._nextObject (packages/mongo/mongo_driver.js:1118:38)",
  "    at SynchronousCursor.forEach (packages/mongo/mongo_driver.js:1132:22)",
  "    at SynchronousCursor.map (packages/mongo/mongo_driver.js:1142:10)",
  "    at SynchronousCursor.fetch (packages/mongo/mongo_driver.js:1166:17)",
  "    at Cursor.<computed> [as fetch] (packages/mongo/mongo_driver.js:920:44)",
  "    at MongoConnection.findOne (packages/mongo/mongo_driver.js:827:56)",
  "    at Collection.findOne (packages/mongo/collection.js:358:29)",
  "    at loginWithToken (app/api/auth/server/resolvers/mutation/login-with-token.ts:16:16)",

我已经尝试了所有我能想到的方法,包括:

apollo-server-express middleware 包装在Meteor.bindEnvironment 中,然后将其附加到连接处理程序

在调用 makeExecutableSchema 之前将每个解析器函数包装在 Meteor.bindEnvironment 中。

我没有想法。如果我降级到 Apollo Server 2.25.2,它可以完美运行。这里还有其他人有这个问题吗?

【问题讨论】:

  • 我还没有与 Apollo 合作过,但是 bindEnvironment 不会将东西包裹在纤维中。您可以尝试改用Meteor.wrapAsync
  • 哦,有趣。另一个问题:您是在自己的代码中使用await,还是在包本身中使用?

标签: meteor apollo-server


【解决方案1】:

版本 2:

const resolvers = {
  Query: {
    getLink: (obj, { id }) => LinksCollection.findOne(id),
    getLinks: () => LinksCollection.find().fetch(),
  },
};

const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: async ({ req }) => ({
    user: await getUser(req.headers.authorization),
  }),
});

server.applyMiddleware({
  app: WebApp.connectHandlers,
  cors: true,
});

版本 3:

  • 为所有解析器查询添加异步
  • 添加 server.start() 函数
const resolvers = {
  Query: {
    getLink: async (obj, { id }) => LinksCollection.findOne(id),
    getLinks: async () => LinksCollection.find().fetch(),
  },
};

const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: async ({ req }) => ({
    user: await getUser(req.headers.authorization),
  }),
});
server.start().then(() => {
  server.applyMiddleware({
    app: WebApp.connectHandlers,
    cors: true,
  });
});

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 2017-06-20
    • 2016-10-25
    • 2014-02-28
    • 2016-12-23
    • 2013-12-05
    • 2016-12-14
    • 2015-12-21
    • 1970-01-01
    相关资源
    最近更新 更多