Многоэлементный анализ полезной нагрузки, отключает обработку POST для всего маршрута GraphQL - PullRequest
1 голос
/ 06 апреля 2020

мы широко используем HAPI 18.4.0 с GraphQL для создания гибкого опыта путешествий. Мы хотим создать возможность загружать файлы через graphQL и сталкиваться с проблемами, связанными с анализом полезной нагрузки для многочастного типа запроса. Мы пишем код обработчика onPreAuth, приведенный ниже.

const Hoek = require('@hapi/hoek');
const {processRequest} = require('graphql-upload');


/* Check whether the request type is 'multipart' and comes from apollo-graphql.
    Don't parse the payload and set mimetype to 'multipart/form-data'.
    Use processRequest from 'graphql-upload' to set the file data to the payload.
    Else continue.
*/


const preMultipartRequestExaminer = (path) => {
    return async (request, h) => {
        const isContentTypeAvailable = request && request.raw && request.raw.req && request.raw.req.headers
        && request.raw.req.headers['content-type'];
        if (isContentTypeAvailable
            && Hoek.reach(request, 'raw.req.headers.content-type').indexOf('multipart/form-data') > -1
            && request.path === path
            && request.method === 'post') {
            request.route.settings.payload.parse = false;
            request.mime = 'multipart/form-data';
            request.pre.payload = await processRequest(request.raw.req, request.raw.res);
        }
        return h.continue;
    };
};

Я устанавливаю request.route.settings.payload.parse = false. Но в изображение входят и другие запросы, которые выдаст ошибку, так как они хотят request.route.settings.payload.parse = true.

Как я могу изменить это и сделать изменение для запроса, а не изменять его на уровне маршрута? И я не могу восстановить разбор полезных данных в значение true, поскольку запросы имеют асинхронный характер c.

Решение основано на https://github.com/apollographql/apollo-server/issues/1680#issuecomment -446330178 (отредактировано)

Мы нашли примечание, приведенное ниже, в документах Hapi, документирующих еще один возможный способ обхода обработки полезной нагрузки для каждого запроса : https://hapi.dev/api/?v=19.1.1# -requestpayload

Полезная нагрузка запроса на основе настроек маршрута payload.output и payload.parse. Устанавливается в undefined в методах расширения 'onRequest' и может быть переопределено на любое неопределенное значение, чтобы обойти обработку полезной нагрузки. Но это похоже на свойство только для чтения в v18 hapi

...