Node js Ошибка CORS - PullRequest
       7

Node js Ошибка CORS

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

Я пытался создать веб-приложение, используя NODE и React без Express маршрутизатора, но у меня возникает много проблем с частью CORS, так как узел и реакция работают на разных портах. Я не хочу использовать express в этом случае, так как я хочу использовать собственный модуль http, предоставленный узлом, поэтому я не могу использовать промежуточное программное обеспечение CORS, которое находится в библиотеке npm.

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

/*
 *   Main server file
 */

//Depenedencies
let https = require('https');
let url = require('url');
let fs = require('fs');
let handlers = require('./lib/handlers');
let stringDecoder = require('string_decoder').StringDecoder;
let decoder = new stringDecoder('utf-8');

//server object definition
let server = {};

//https certifications
server.certParams = {
    'key': fs.readFileSync('../lib/Certificates/serverKey.key'),
    'cert': fs.readFileSync('../lib/Certificates/serverCert.crt')
};

server.https = https.createServer(server.certParams, (req, res) => {

    server.unifiedServer(req, res);

});

//main server 
server.unifiedServer = (req, res) => {

    //converting url to url object
    let parsedUrl = url.parse("https://" + req.rawHeaders[1] + req.url, true);
    //constructing required params for handlers
    let method = req.method;
    let route = parsedUrl.pathname;
    let queryStringObject = parsedUrl.query;
    let headers = req.headers;

    //function specific params
    let requestBodyString = "";
    let chosenHandler;
    let requestObject = {};
    let responsePayload = {
        'Payload': {},
        'Status': ""
    };

    //streaming in the req body in case of post req
    req.on("data", function(chunk) {
        requestBodyString += chunk;
    });

    //this is called regardless of the method of the req
    req.on("end", function() {

        //this is specific to post req
        requestBodyString += decoder.end();

        requestBodyString = method == "POST" ? JSON.parse(requestBodyString) : {};

        //the request object sent to the handlers
        requestObject.method = method;
        requestObject.reqBody = requestBodyString;
        requestObject.queryObject = queryStringObject;

        chosenHandler = server.handlers[route] ? server.handlers[route] : server.handlers.notFound;        

        let headers = {
            "Access-Control-Allow-Origin" :  "https://localhost:3000/",
            "Access-Control-Allow-Methods" : "OPTIONS, POST, GET",
            "Access-Control-Allow-Headers" : "Origin, Content-Type"
        };

        chosenHandler(requestObject)
            .then((result) => {
                //post handler call
                responsePayload.Status = "SUCCESS";
                responsePayload.Payload = result;

                //send the data back
                res.writeHead(200,headers);
                res.write(JSON.stringify(responsePayload));
                res.end();
            }).catch((error) => {
                //error handler 
                responsePayload.Status = "ERROR-->" + error;

                //send the data back
                res.writeHead(200,headers);
                res.write(JSON.stringify(responsePayload));
                res.end();
            });
    });
};

//router definition
server.handlers = {
    '/login': handlers.login,
    '/signup': handlers.signup,
    '/checkUserName': handlers.checkUserName,
    '/checkEmail': handlers.checkEmail,
    '/notFound': handlers.notFound
};

//init function
server.init = () => {
    //start the https server
    //TODO--> Change this to handle changing port and env
    server.https.listen(5000, function() {
        console.log('The https server is listening on port 5000 in Development mode');
    });
};

//export the module
module.exports = server;

Я отправляю пост-запрос для проверки соединения, но получаю это всегда:

Запрос перекрестного происхождения заблокирован: Такая же политика происхождения запрещает чтение удаленного ресурса по адресу https://localhost: 5000 / логин . (Причина: запрос CORS не выполнен).

Может кто-нибудь сказать, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 15 января 2020

Установите заголовок «Access-Control-Allow-Origin» в объекте потока ответов.

Попробуйте с приведенным ниже фрагментом -

server = http.createServer(function(req,res){
    // Set CORS headers
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Request-Method', '*');
    res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET');
    res.setHeader('Access-Control-Allow-Headers', '*');
    if ( req.method === 'OPTIONS' ) {
        res.writeHead(200);
        res.end();
        return;
    }

    // ...
});

ИЛИ это не работает, попробуйте используя -


res.setHeader('Access-Control-Allow-Headers', req.header.origin);

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

Используйте это промежуточное ПО после let decoder = new stringDecoder('utf-8');

var express    = require('express');
var app        = express();

var allowCrossDomain = function (req, res, next) {
      res.header('Access-Control-Allow-Origin', '*');
      res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
      res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
      res.header('Access-Control-Allow-Credentials', 'true');
      // intercept OPTIONS method
      if ('OPTIONS' == req.method) {
          res.status(200).send();
      } else {
          next();
      }
};


app.use(allowCrossDomain);

Это применимо для express framework.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...