rea*_*ser 8 javascript node.js cors reactjs
我使用 create-react-app 来构建我的 React 应用程序。这个应用程序在另一个 API (elasticsearch) 上执行 POST 调用,该 API 托管在不同的服务器上(不是我拥有/管理的)。因此,一旦用户在表单中输入数据,onSubmit 基本上会调用进行调用的 getResponse() 方法。初始化客户端:
let client = new elasticsearch.Client({
host: "https://{cred.user}:{cred.pass}@@servername.domain:11121",
log: "trace",
});
Run Code Online (Sandbox Code Playgroud)
API查询:
getResponse = () => {
client
.search({
index: 'custom_index_1',
body: {
query: {
match: {"data": this.state.data}
},
}
},function(error, response, status) {
if (error) {
const errorMessage= {error};
console.log(errorMessage);
}
else {
this.setState({results: response.hits.hits});
console.log(this.state.results);
}
});
}
Run Code Online (Sandbox Code Playgroud)
但我收到 CORS 错误如下:
Failed to load resource: the server responded with a status of 403 (Forbidden)
localhost/:1 Access to XMLHttpRequest at 'https://servername.domain:11121/' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.console.js:40
WARNING: 2019-11-21T07:54:32Z No living connections
Run Code Online (Sandbox Code Playgroud)
在阅读关于同一问题的 SO 后,我发现使用 cors npm 模块可以解决这个问题(至少在开发中)。但我不明白我把这段代码放在哪里:
var express = require('express')
var cors = require('cors')
var app = express()
app.use(cors())
Run Code Online (Sandbox Code Playgroud)
或者
var express = require('express')
var cors = require('cors')
var app = express()
app.use(cors())
app.get('/products/:id', function (req, res, next) {
res.json({msg: 'This is CORS-enabled for all origins!'})
})
app.listen(80, function () {
console.log('CORS-enabled web server listening on port 80')
})
Run Code Online (Sandbox Code Playgroud)
我的问题如下: 1. 上面这段代码在哪里添加?在我的反应应用程序的 app.js 中?如果是的话,有人可以给我一个例子吗?我正在使用这样的东西:
import statements
class App extends Component {
<code>
}
export default App;
Run Code Online (Sandbox Code Playgroud)
如果要将此代码添加到其他文件中,那么是哪个文件?是 server.js 吗?如果是,我在哪里可以找到这个?我使用的是 Windows 7。Node 安装在客户目录中:C:\MYSW\NodeJs\12.1.0。我在这里看到一些 server.js:C:\Users\user1\Scratch\node\myreact_ui\node_modules\react-dom\server.js,但它是正确的文件
请给我一个示例,说明如何添加代码以及在文件中的确切位置。我是 React 和 Node 的新手,所以我不太了解内部原理。我已经被困在这里好几天了,真的需要一些帮助。谢谢。
它说的到处都是,添加此代码并且它可以工作,没有人提到我在哪里添加它以及如何添加?任何帮助表示赞赏。
在 node js API 中添加以下代码
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
Run Code Online (Sandbox Code Playgroud)
或者
//allow OPTIONS on all resources
app.options('*', cors())
Run Code Online (Sandbox Code Playgroud)
您需要为 API 请求设置代理服务器 - https://create-react-app.dev/docs/proxying-api-requests-in-development/
我不完全了解 Elastic 服务器的细节,但您可以将 Express 代码放入src/server.js文件中,灵感来自/sf/answers/1437746761/:
var express = require('express')
var request = require('request')
var cors = require('cors')
var app = express()
app.use(cors())
app.use('/', function(req, res) {
var url = 'https://' +
req.get('host').replace('localhost:80', 'servername.domain:11121') +
req.url
req.pipe(request({ qs:req.query, uri: url })).pipe(res);
})
app.listen(80, function () {
console.log('CORS-enabled web server listening on port 80')
})
Run Code Online (Sandbox Code Playgroud)
更新 package.json
"scripts": {
...
"server": "node src/server.js"
},
"proxy": "http://localhost:80"
Run Code Online (Sandbox Code Playgroud)
修改您的客户端:
let client = new elasticsearch.Client({
host: "{cred.user}:{cred.pass}@@localhost:80",
log: "trace",
});
Run Code Online (Sandbox Code Playgroud)
并通过npm run server(之前或之后npm start,例如在单独的终端中)启动它。
在第一次开始之前,您需要安装所有required 模块,npm i -D express request cors.