Express. js и CORS - PullRequest
       8

Express. js и CORS

0 голосов
/ 10 января 2020

Я создал интерфейс, используя react.js, а сервер API - express.js. Чтобы позаботиться о CORS, я использовал пакет cors в качестве следующего примера:

var passport = require("passport");
const express = require('express');
const cors = require('cors');

const app = express();
app.use(cors());
app.use('/route1', passport.authenticate('jwt', {session: false}), route1)
app.use('/route2', passport.authenticate('jwt', {session: false}), route2)
app.use('/route3', passport.authenticate('jwt', {session: false}), route3)

app.use(function(req, res, next) { /* catch 404 and forward to error handler */
  next(createError(404));
});

app.listen(app.get('port'), () => {    
  logger.info('Server started')
})  

Все маршруты работают хорошо, пока не будут выполнены два последовательных запроса на один и тот же маршрут. Например:

POST example.com/route1
GET example.com/route1

Я получу ошибку No 'Access-Control-Allow-Origin' header is present on the requested resource. в консоли браузера для запроса GET. Но если я изменю путь маршрутов, например:

POST example.com/route1
GET example.com/route1/example

, это сработает.

Оба сервера работают на apache веб-сервере. К моему внутреннему серверу обращается https, который перенаправляет его на nodejs сервер, работающий по http.

Что я делаю не так? Спасибо.

изменить: как и просили, вот фрагмент route1

const express = require('express')
const router = express.Router()
const errors = require('./error_handler');

router.post('/', async (req, res, next) => {
    const result = 
        /* DB Middleware */
        .catch((err) => errors.errorHandler(err,res))

    if(!res.headersSent) /* Making this condition to check if errorHandler() already sent an error response */
        res.send(result);
})

router.get('/', async (req, res, next) => {
    if(req.query.course === undefined)
        res.send(400);  


    let result =
        /* DB Middleware */
        .catch((err) => errors.errorHandler(err,res))


    if(!res.headersSent)
        res.send(result)
})

module.exports = router

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Включите в приложение приведенный ниже код. js:

var express = require('express')
var cors = require('cors')
var app = express()
var whitelist = ['http://example1.com', 'http://example2.com']
var corsOptions = {
  origin: function (origin, callback) {
    if (whitelist.indexOf(origin) !== -1) {
      callback(null, true)
    } else {
      callback(new Error('Not allowed by CORS'))
    }
  }
}
app.use(cors(corsOptions));

И вы можете создать общее промежуточное ПО, которое будет использоваться в любом API, где вы хотите поддерживать Cors.

var AllowedOrigins = ['http://example1.com', 'http://example2.com'];
setCorsHeaders: function (req, res, next) {
    let requestDomain = req.headers.Origin;
     AllowedOrigins.forEach(allowedOrigin => {
         if (requestDomain === allowedOrigin) {
            res.setHeader('Access-Control-Allow-Origin', requestDomain);
            res.setHeader('Access-Control-Allow-Credentials', true);
            res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
         }
     });
     if (req.method === 'OPTIONS') {
        res.status(200);
     } else {
        next();
     }
}
0 голосов
/ 10 января 2020

У меня была проблема в проекте некоторое время go, я добавил это в свое приложение и работал на меня. Это потому, что вам нужно разрешить каждому источнику доступ к вашему проекту.

app.use(function (req, res, next) {
    // Website you wish to allow to connect
    res.setHeader('Access-Control-Allow-Origin', '*');
    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', true);
    // Pass to next layer of middleware
    next();
});

Если это не работает, попробуйте добавить crossDomain к вашему запросу, например:

 $.ajax({
    url: url,
    crossDomain: true,
    data: form,
    dataType: 'json',
    success: function(data) {
        console.log(data);
    },
    type: 'POST'
});
...