我可能在这里误会。
我有一个在localhost:8080
运行的节点服务器,以及一个在get
运行的React应用程序。
React应用程序正在向节点服务器发出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.log('Example app listening on port 3000!'))
请求 - 我的服务器代码如下所示:
house_user
我尝试设置localhost:8080
令牌,以便稍后跟踪用户的请求。
但是,未在用户上设置令牌(来自house_user
的请求) - req.cookies
令牌始终为空(事实上, Bundle.main.url(forResource: "paper", withExtension: "pdf")
完全为空)。我还需要做点什么吗?
答案 0 :(得分:1)
我刚试过下面的代码(并且它有效)。提醒一下,您可以将其粘贴到myNodeTest.js中,然后运行node myNodeTest.js
并访问http://localhost:3003。如果确实有效,那么可能意味着您遇到了CORS问题。
[EDIT] withCredentials:true应该使用axios进行操作。
axios.get('localhost:3000', {withCredentials: true}).then(function (res) { console.log(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.log('something bad happened', err)
}
console.log(`server is listening on ${port}`)
})
答案 1 :(得分:1)
将我的评论写成答案,因为它似乎解决了你的问题。
由于您运行的是http
,而不是https
,因此您需要从Cookie中删除secure: true
,因为这样只能通过https
发送Cookie连接将阻止浏览器通过http
连接将其发回给您。
此外,删除res.append(...)
只需res.cookie()
即可。