#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. Это очень простое исправление, поскольку оно возвращает все настройки по умолчанию. Спасибо!