我有一个React应用程序,该应用程序通过API从单独的数据库中提取数据。
在本地运行时,该应用程序是一个端口,而API在另一个端口上。
自从我在应用程序中对API进行AJAX调用后,我需要包含API可以连接的URL。
如果我对单独的端口进行硬编码(例如,应用程序在http://localhost:3000上,API在http://localhost:3100上,则对API http://localhost:3100/api/trusts进行AJAX URL调用,则可以正常工作。)
但是,由于应用程序和API位于不同的端口上,因此我无法将AJAX网址设为相对路径,因为它错误地将AJAX调用发送到了http://localhost:3000/api/trusts而不是http://localhost:3100/api/trusts。
如何让它们在同一端口上运行?
谢谢!
这是我的server.js:
var express = require('express');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var path = require('path');
var app = express();
var router = express.Router();
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
//set our port to either a predetermined port number if you have set it up, or 3001
var port = process.env.PORT || 5656;
//db config
var mongoDB = 'mongodb://XXX:XXX!@XXX.mlab.com:XXX/XXX';
mongoose.connect(mongoDB);
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'MongoDB connection error:'));
//body parsing
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// allow cross-browser
app.use(function(req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
next();
});
// handling static assets
app.use(express.static(path.join(__dirname, 'build')));
// api handling
var TrustsSchema = new Schema({
id: String,
name: String
});
var Trust = mongoose.model('Trust', TrustsSchema);
const trustRouter = express.Router();
trustRouter
.get('/', (req,res) => {
Trust.find(function(err, trusts) {
if (err) {
res.send(err);
}
res.json(trusts)
});
});
app.use('/api/trusts', trustRouter);
//now we can set the route path & initialize the API
router.get('/', function(req, res) {
res.json({ message: 'API Initialized!'});
});
app.get('/*', function (req, res) {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});
app.listen(port, function() {
console.log(`api running on port ${port}`);
});
下面是我要进行的AJAX调用不起作用,因为相对路径附加到应用程序的端口(即http://localhost:3000/)而不是API的端口(即{{3}) }):
axios.get("/api/trusts")
.then(res => {
this.setState({trusts: res.data});
})
.catch(console.error);
答案 0 :(得分:3)
要告诉开发服务器将任何未知请求代理到开发中的API服务器,请将代理字段添加到package.json中,例如:
"proxy": "http://localhost:4000",
这样,当您
fetch('/api/todos')
进行开发时,开发服务器将识别出它不是静态资产,并将您的请求代理到http://localhost:4000/api/todos
上作为后备。开发服务器只会尝试将text/html
标头中没有Accept
的请求发送给代理。
“请记住,代理仅在开发中起作用(从npm start开始),由您来确保/ api / todos之类的URL指向生产中正确的事物。”
注意:此功能在react-scripts@0.2.3及更高版本中可用。