代码之家  ›  专栏  ›  技术社区  ›  Simon

已删除对{其中:'原始查询'}的支持

  •  1
  • Simon  · 技术社区  · 7 年前

    我正在AWS Lambda上使用无服务器框架运行GraphQL服务器。 我正在使用 apollo-link-batch-http

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

    这个 Model.cached(300) 是我做的一个很小的缓存包装器。您可以在此处看到: https://gist.github.com/lookapanda/4676083186849bb6c5ae6f6230ad7d8f 它基本上只是让我能够使用自己的 findById 功能等。

    奇怪的是,如果我使用 apollo链接批处理http 但如果我使用 apollo-link-http 。因此,如果将请求批处理到单个GraphQL请求中,则不会出现此类错误(不过,我会得到以下错误: https://github.com/sequelize/sequelize/issues/9242 )

    我真的不知道那里发生了什么,这些解析器中都没有原始where查询。更奇怪的是,它只发生在缓存的结果上。第一个请求完全有效且成功,但随后每个连续请求都会失败,并显示上述错误消息。

    我真的希望有人能帮我,我疯了: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 回复  |  直到 7 年前
        1
  •  0
  •   Simon    7 年前

    好的,在冗长的调试之后,我发现在可缓存包装器中我使用了以下代码段: https://github.com/sequelize/sequelize/issues/2325#issuecomment-366060303

    我仍然不知道,为什么这个错误只出现在Lambda上而不是本地,但当我只使用 selectQuery() 方法并仅返回该值,而不是整个 Model.addHook 等等。所以基本上改变了这个

    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);
    };
    
        2
  •  0
  •   agascon    5 年前

    我遇到了类似的情况,但在我的情况下,使用以下代码效果很好:

    .findAll({
        where: {
            title: req.params.title 
        } 
    })
    
    推荐文章