Я могу здесь неправильно понять.
У меня есть сервер узла, работающий на localhost:3000, и приложение React, работающее на localhost:8080.
Приложение React отправляет запрос get на сервер узла - мой код сервера для этого выглядит так:
const cookieParser = require('cookie-parser');
const crypto = require('crypto');
const express = require('express');
const app = express();
app.use(cookieParser());
app.get('/', function (req, res) {
let user_token = req.cookies['house_user']; // always empty
if (user_token) {
// if the token exists, great!
} else {
crypto.randomBytes(24, function(err, buffer) {
let token = buffer.toString('hex');
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8080');
res.cookie('house_user', token, {maxAge: 9000000000, httpOnly: true, secure: false });
res.send(token);
});
}
});
app.listen(3000, () => console.info('Example app listening on port 3000!'))
Я пытаюсь установить токен house_user, чтобы потом отслеживать запросы от пользователей.
Однако токен не устанавливается для пользователя (запрос от localhost:8080) - токен house_user всегда пуст (на самом деле req.cookies полностью пуст). Мне нужно что-то еще делать?
@ jfriend00 Вы правы - мне плохо; слишком много просеивая сообщения в стеке и пробуя несколько решений: ')





Я просто попробовал приведенный ниже код (и он сработал). Напоминаем, что вы можете просто вставить это в myNodeTest.js, затем запустить node myNodeTest.js и посетить http: // локальный: 3003. Если это работает, то, вероятно, у вас проблемы с CORS.
[РЕДАКТИРОВАТЬ] withCredentials: true должно работать с аксиомами.
axios.get('localhost:3000', {withCredentials: true}).then(function (res) { console.info(res) })
const express = require('express')
const cookieParser = require('cookie-parser')
const crypto = require('crypto');
const port = 3003
app.use(cookieParser());
app.get('/', function (req, res) {
let user_token = req.cookies['house_user']; // always empty
if (user_token) {
// if the token exists, great!
} else {
crypto.randomBytes(24, function(err, buffer) {
let token = buffer.toString('hex');
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8080');
res.cookie('house_user', token, {maxAge: 9000000000, httpOnly: true, secure: true });
res.append('Set-Cookie', 'house_user=' + token + ';');
res.send(token);
});
}
});
app.get('/', (request, response) => {
response.send('Hello from Express!')
})
app.listen(port, (err) => {
if (err) {
return console.info('something bad happened', err)
}
console.info(`server is listening on ${port}`)
})
Привет :) - Мне потребовался парсер файлов cookie (обновил мой пост, чтобы показать сейчас) - к сожалению, я все еще не получаю файлы cookie от req.cookies в последующих запросах.
Вы пробовали код, который я опубликовал, просто с помощью простого node myNodeTest.js и посетили localhost: 3003? Я получил твое печенье;)
Здесь я думаю, что могу неправильно понять - моя цель - установить файл cookie на клиенте (то есть мое приложение React, работающее на localhost: 8080), которое отправляет запрос на получение на сервер Node. Я не уверен, возможно ли это.
Конечно, я знаю, но если это сработает, как я уже упоминал, мы сделаем еще один шаг вперед, зная, что это, вероятно, связано с CORS. Вы используете SSR, например Next.js?
Я так не думаю - я использую React с Axiom, чтобы сделать запрос вроде: axios.get ('localhost: 3000 '). then (функция (res) {console.info (res)})
Я буду редактировать поэтапно, основываясь на ваших комментариях. Проблема действительно исходит от Axios, в этом уверены на 99%.
Asten - добавление withCredentials: true сработало! Большое вам спасибо: D
@ConnorCartwright, пожалуйста, после того, как вы рассказали мне об Axios, я был уверен, что проблема в этом;) Ура
Превращаю свой комментарий в ответ, поскольку он, похоже, решил вашу проблему.
Поскольку вы работаете на http, а не на https, вам необходимо удалить secure: true из файла cookie, так как это приведет к тому, что cookie будет отправляться только через соединение https, что не позволит браузеру отправить его вам обратно через ваше соединение http.
Также удалите res.append(...), так как res.cookie() - это все, что нужно.
Повторите комментарии к ответу Астена, проблема все еще сохраняется, но, возможно, я просто пытаюсь сделать что-то, что невозможно.
@ConnorCartwright - Ваш запрос axios должен быть: axios.get('http://localhost:3000').then(...).catch(...) с протоколом в URL.
res.cookie...()- это все, что вам нужно, поэтому удалитеres.append().secure:trueпозволит cookie работать только сhttps. Запрос выполняется наhttps?