支持`{where:'raw query'}`已被删除

时间:2018-04-05 17:01:09

标签: javascript lambda sequelize.js graphql serverless-framework

我在AWS Lambda上使用无服务器框架运行GraphQL服务器。 我正在使用apollo-link-batch-http在UI中获取数据。

如果我使用serverless-offline在本地运行它,它可以正常工作。但是,如果我在AWS Lambda上运行它,它会成功解析fooResolver但不会barResolver,因为它会抛出上述错误消息。

Model.cached(300)是我制作的一个小型缓存包装器。你可以在这里看到它: https://gist.github.com/lookapanda/4676083186849bb6c5ae6f6230ad7d8f 它基本上只是让我能够使用我自己的findById函数等等。

奇怪的是,如果我使用apollo-link-batch-http,则只会出现此错误,但如果我使用apollo-link-http则不会出现此错误。因此,如果将请求批处理为单个GraphQL请求,则不会出现此类错误(尽管如此,我会收到此错误:https://github.com/sequelize/sequelize/issues/9242

我真的不知道那里发生了什么,在任何解析器中都没有查询原始查询。它变得更加怪异:它只发生在缓存结果中。第一个请求完全有效且成功,但随后每个连续请求都会因上述错误消息而失败。

我真的希望有人能帮助我,我疯了:D

export const fooResolver = async () => {
  const Model = db.getDB().sequelize.models.fooModel;
  const data = await Model.cached(300).findAll({
      where: {
          time: {
              [Op.gt]: Model.sequelize.literal('CURRENT_TIMESTAMP()'),
          },
          enabled: true,
          state: 'PLANNED',
      },
      order: [['time', 'DESC']],
      limit: 5,
  });
  return data.value;
};

export const barResolver = async () => {
  const models = db.getDB().sequelize.models;
  const Model = models.fooModel;
  const data = await Model.findById(data.id, {
    include: [
      {
        model: models.barModel,
        include: [
          {
            association: 'fooAssociation',
            include: [{ association: 'barAssociation' }],
            order: ['showOrder', 'ASC'],
          },
        ],
      },
    ],
  });

  return {
    data,
  };
};  

2 个答案:

答案 0 :(得分:0)

好的,所以经过繁琐的调试后我发现在可缓存的包装器中我使用的是这个片段: https://github.com/sequelize/sequelize/issues/2325#issuecomment-366060303

我真的不知道为什么,为什么这个错误只出现在Lambda而不是本地,但是当我只使用Model.addHook方法并且只返回而不是整个{时,它停止了错误{1}}东西等等。所以基本上改变了这个

export const getSqlFromSelect = (Model, method, args) => {
  if (!SUPPORTED_SELECT_METHODS.includes(method)) {
    throw new Error('Unsupported method.');
  }

  const id = generateRandomHash(10);

  return new Promise((resolve, reject) => {
    Model.addHook('beforeFindAfterOptions', id, options, => {
      Model.removeHook('beforeFindAfterOptions', id);

      resolve(
        Model.sequelize.dialect.QueryGenerator.selectQuery(
          Model.getTableName(),
          options,
          Model
        ).slice(0, -1)
      );
    });

    return Model[method](...args).catch(reject);
  });
};

到这个

export const getSqlFromSelect = (Model, identifier, options) => {
  if (typeof identifier === 'number' || typeof identifier === 'string' || Buffer.isBuffer(identifier) {
    options.where = {
      [Model.primaryKeyAttribute]: identifier,
    };
  };

  return Model.sequelize.dialect.QueryGenerator.selectQuery(
    Model.getTableName(),
    options,
    Model
  ).slice(0, -1);
};

答案 1 :(得分:0)

我遇到了类似的情况,除了在我的情况下使用以下代码可以很好地工作:

.findAll({
    where: {
        title: req.params.title 
    } 
})