Обратный цикл 4 CORS не работает, несмотря на подстановочный знак

#loopbackjs #loopback4

#loopbackjs #loopback4

Вопрос:

В документации указано, что CORS включен по умолчанию. Но с конфигурацией CORS по умолчанию я все еще получаю проблемы CORS. Проверяя заголовки ответа, заголовки CORS не прикреплены.

Доступ к XMLHttpRequest по адресу ‘http://localhost:8081/sessions ‘ из источника’http://local.example.com ‘ заблокирован политикой CORS: ответ на предполетный запрос не проходит проверку контроля доступа: заголовок ‘Access-Control-Allow-Origin’ отсутствует в запрошенном ресурсе.

 // src/index.ts

if (require.main === module) {
  // Run the application
  const config: ApplicationConfig = {
    rest: {
      port:  (process.env.PORT ?? 8081),
      host: process.env.HOST,
      // The `gracePeriodForClose` provides a graceful close for http/https
      // servers with keep-alive clients. The default value is `Infinity`
      // (don't force-close). If you want to immediately destroy all sockets
      // upon stop, set its value to `0`.
      // See https://www.npmjs.com/package/stoppable
      gracePeriodForClose: 5000, // 5 seconds
      openApiSpec: {
        // useful when used with OpenAPI-to-GraphQL to locate your application
        setServersFromRequest: true,
      },
      cors: {
        origin: '*',
        methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
        preflightContinue: false,
        optionsSuccessStatus: 204,
        credentials: true,
      },
    },
  }
  main(config).catch((err) => {
    console.error('Cannot start the application.', err)
    process.exit(1)
  })
}
  

Комментарии:

1. Была ли последовательность обновлена для использования новой последовательности на основе промежуточного программного обеспечения ( loopback.io/doc/en/lb4/REST-middleware-sequence.html )?

2. сталкиваюсь с той же проблемой

Ответ №1:

Я предполагаю, что это проблема, возникающая с более новыми версиями LB4. Вот обходной путь, который вы можете ввести в MySequence (убедитесь, что вы добавили последовательность в application.ts):

     async handle(context: RequestContext) {
        try {
            const { request, response } = context;
            // add this
            await this.invokeMiddleware(context, this.options);
            response.header('Access-Control-Allow-Origin', '*');
            response.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
            if (request.method == 'OPTIONS') {
                response.status(200)
                this.send(response, 'ok');
            } else {
                // end add this
                const route = this.findRoute(request);
                await this.authenticateRequest(request);
                const args = await this.parseParams(request, route);
                const result = await this.invoke(route, args);
                this.send(response, result);
            }
        } catch (err) {
            if (
                err.code === AUTHENTICATION_STRATEGY_NOT_FOUND ||
                err.code === USER_PROFILE_NOT_FOUND
            ) {
                Object.assign(err, { statusCode: 401 /* Unauthorized */ });
            }
            this.reject(context, err);
        }
  

Пожалуйста, не обращайте внимания на все остальные вещи, такие как auth / промежуточное программное обеспечение, все дело в этом if (request.method == 'OPTIONS') {}

Ответ №2:

У меня была такая же проблема, при использовании MiddlewareSequence вместо DefaultSequence ошибки CORS исчезли.

Просто измените sequence.ts файл на этот:

 import {MiddlewareSequence} from '@loopback/rest';

export class MySequence extends MiddlewareSequence {}
  

Проверьте документы для получения дополнительной информации:
https://loopback.io/doc/en/lb4/REST-middleware-sequence.html#use-the-sequence-for-your-rest-application

Комментарии:

1. Это очень простое исправление, поскольку оно возвращает все настройки по умолчанию. Спасибо!