Поддержка `{where: 'raw query'}` была удалена.

Я запускаю сервер GraphQL, используя бессерверную структуру на AWS Lambda. Я получаю данные в пользовательском интерфейсе, используя apollo-link-batch-http.

Если я запускаю его локально, используя 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)

Я действительно не знаю, что там происходит, ни в одном из этих распознавателей нет сырого запроса 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,
  };
};  

person Simon    schedule 05.04.2018    source источник


Ответы (2)


Итак, после утомительной отладки я обнаружил, что в кешируемой обертке я использовал этот фрагмент: 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);
};
person Simon    schedule 06.04.2018

Я столкнулся с похожей ситуацией, за исключением того, что в моем случае хорошо работает приведенный ниже код:

.findAll({
    where: {
        title: req.params.title 
    } 
})
person Emmanuel M.    schedule 16.07.2020