#node.js #express #reactjs #cors #reactjs-flux
#node.js #экспресс #reactjs #cors #reactjs-flux
Вопрос:
У меня есть интерфейс, работающий в react flux node, и серверная часть, работающая на Java. Я использую суперагент для отправки запросов от действия react в серверную часть, что успешно происходит, и я пытаюсь отправить пользовательские заголовки из серверной части, которая также работает нормально и отправляется из серверной части во внешний интерфейс, как я вижу в сетях браузеров (отладка запроса и ответа).Однако, когда я пытаюсь получить доступ к заголовкам в действии react, я этого не вижу.Может кто-нибудь, пожалуйста, подскажите мне, как я могу справиться с этим?
Пользовательский заголовок, к которому я хочу получить доступ, — это X-Token, но я не вижу его в ответе суперагента в действии react. Функция действия react выглядит следующим образом:
login(payload) {
request.post(someurl '/login')
.send({
username: payload.userEmail,
password: payload.userPassword
})
.set('Accept', 'application/json')
.end(function(err, res){
if (err || !res.ok) {
} else {
console.log(res.headers) //it doesnt give x-token header.
}
});
}
}
Ниже приведен мой серверный js-контент:
var app = express();
app.options('*', cors());
app.set('port', process.env.PORT || 3001);
app.use(compression());
app.use(logger('dev'));
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
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, OPTIONS, PUT, PATCH, DELETE');
// Request headers you wish to allow
res.setHeader("Access-Control-Allow-Headers", "X-Token,Origin,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();
});
app.use(express.static(path.join(__dirname, 'public')));
app.engine('html', consolidate['swig']);
app.set('view engine', 'html');
app.set('views', './views');
app.use(function(req, res) {
Router.match({ routes: routes.default, location: req.url }, function(err, redirectLocation, renderProps) {
if (err) {
res.status(500).send(err.message)
} else if (redirectLocation) {
res.status(302).redirect(redirectLocation.pathname redirectLocation.search)
} else if (renderProps) {
var html = ReactDOM.renderToString(React.createElement(Router.RoutingContext, renderProps));
var page = swig.renderFile('views/index.html', { html: html });
res.status(200).send(page);
} else {
res.status(404).send('Page Not Found')
}
});
});
require('./app/routes/server-route')(app, express);
var server = require('http').createServer(app);
server.listen(app.get('port'), function() {
console.log('Express server listening on port ' app.get('port'));
});
Заранее спасибо за помощь.
Ответ №1:
Вы уверены? setHeader
экспресс-документация api для заголовка есть setHeaders
.
Комментарии:
1. @Damiem Leroux Спасибо за ваш ответ. Но когда я увидел другой пример, я смог увидеть приведенный выше способ настройки заголовков. Не могли бы вы привести мне какой-нибудь пример альтернативного подхода?
2. вызываемые функции зависят от версии ‘express’, которую вы используете. В вашем случае, какую версию вы используете?
3. Спасибо. Версия express — 4.14.0. Не могли бы вы подсказать мне, как решить проблему. Я знаю, что нам нужно настроить cors, но приведенная выше конфигурация не работает для меня.