Node.js 节点js CORS故障
我一直在尝试在没有Express router的情况下使用NODE和React构建一个web应用程序,但由于NODE和React都在不同的端口上运行,所以我在CORS部分遇到了很多问题。在这种情况下,我不想使用express,因为我想使用node提供的本机http模块,因此我无法使用npm库中的CORS中间件 我已经尝试了每一个可能的解决办法,这将有助于解决CORS问题,但我现在在一个死胡同。我在下面分享了我的服务器端代码Node.js 节点js CORS故障,node.js,reactjs,express,cors,Node.js,Reactjs,Express,Cors,我一直在尝试在没有Express router的情况下使用NODE和React构建一个web应用程序,但由于NODE和React都在不同的端口上运行,所以我在CORS部分遇到了很多问题。在这种情况下,我不想使用express,因为我想使用node提供的本机http模块,因此我无法使用npm库中的CORS中间件 我已经尝试了每一个可能的解决办法,这将有助于解决CORS问题,但我现在在一个死胡同。我在下面分享了我的服务器端代码 /* * Main server file */ //Depe
/*
* 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;
我正在发出post请求以测试连接,但每次都会收到以下消息:
跨源请求被阻止:同一源策略不允许读取位于的远程资源。(原因:CORS请求未成功)。
有人能告诉我我做错了什么吗?在响应流对象中设置“访问控制允许来源”标题
请尝试以下代码片段-
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);
在
let decoder=newstringdecoder('utf-8')之后使用此中间件代码>
这与express
框架相关。尝试将您的ACAO、ACAM和ACAH头设置为just*
,并查看其是否工作,查看浏览器控制台网络选项卡,查看服务器在收到飞行前(选项
)请求时响应的头
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);