在我的应用程序中,我需要使用快捷框架设置一个cookie。我已经尝试了下面的代码,但它没有设置cookie。
var express = require('express'), http = require('http');
var app = express();
app.configure(function(){
app.use(express.cookieParser());
app.use(express.static(__dirname + '/public'));
app.use(function (req, res) {
var randomNumber=Math.random().toString();
randomNumber=randomNumber.substring(2,randomNumber.length);
res.cookie('cokkieName',randomNumber, { maxAge: 900000, httpOnly: true })
console.log('cookie have created successfully');
});
});
var server = http.createServer(app);
var io = require('socket.io').listen(server);
server.listen(5555);
我不是在回答你的问题,但我在寻找一个问题的答案时,遇到了你的问题。也许它会帮助其他人。
我的问题是在服务器响应中设置了cookie,但浏览器没有保存。
服务器返回设置了cookie的响应:
Set-Cookie:my_cookie=HelloWorld; Path=/; Expires=Wed, 15 Mar 2017 15:59:59 GMT
我就是这样解出来的。
我在客户端代码中使用了fetch。如果您没有在获取选项中指定凭据:'include', cookie既不会发送到服务器也不会被浏览器保存,即使服务器响应设置了cookie。
例子:
var headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Accept', 'application/json');
return fetch('/your/server_endpoint', {
method: 'POST',
mode: 'same-origin',
redirect: 'follow',
credentials: 'include', // Don't forget to specify this if you need cookies
headers: headers,
body: JSON.stringify({
first_name: 'John',
last_name: 'Doe'
})
})
在Express中使用中间件的顺序很重要:前面声明的中间件将首先被调用,如果它可以处理请求,后面声明的任何中间件都不会被调用。
如果表达。Static正在处理请求,你需要移动你的中间件:
// need cookieParser middleware before we can do anything with cookies
app.use(express.cookieParser());
// set a cookie
app.use(function (req, res, next) {
// check if client sent cookie
var cookie = req.cookies.cookieName;
if (cookie === undefined) {
// no: set a new cookie
var randomNumber=Math.random().toString();
randomNumber=randomNumber.substring(2,randomNumber.length);
res.cookie('cookieName',randomNumber, { maxAge: 900000, httpOnly: true });
console.log('cookie created successfully');
} else {
// yes, cookie was already present
console.log('cookie exists', cookie);
}
next(); // <-- important!
});
// let static middleware do its job
app.use(express.static(__dirname + '/public'));
同样,中间件需要结束请求(通过发回响应),或者将请求传递给下一个中间件。在本例中,我通过在设置cookie时调用next()来实现后一种方法。
更新
到目前为止,cookie解析器是一个单独的npm包,所以不用
app.use(express.cookieParser());
你需要使用NPM I cookie-parser单独安装它,然后将其用作:
const cookieParser = require('cookie-parser');
app.use(cookieParser());
在express中设置cookie非常简单
首先安装cookie-parser
npm install cookie-parser
使用中间件
const cookieParser = require('cookie-parser');
app.use(cookieParser());
设置cookie了解更多
res.cookie('cookieName', '1', { expires: new Date(Date.now() + 900000), httpOnly: true })
访问cookie可以了解更多信息
console.dir(req.cookies.cookieName)
完成了!
饼干?
res.cookie('cookieName', 'cookieValue')
读过饼干吗?
req.cookies
Demo
const express('express')
, cookieParser = require('cookie-parser'); // in order to read cookie sent from client
app.get('/', (req,res)=>{
// read cookies
console.log(req.cookies)
let options = {
maxAge: 1000 * 60 * 15, // would expire after 15 minutes
httpOnly: true, // The cookie only accessible by the web server
signed: true // Indicates if the cookie should be signed
}
// Set cookie
res.cookie('cookieName', 'cookieValue', options) // options is optional
res.send('')
})
同构读cookie助手:
function getCookieValue(cookieName = '', cookie = '') {
const matches = cookie.match(`(^|[^;]+)\\s*${cookieName}\\s*=\\s*([^;]+)`)
return matches ? matches.pop() : ''
}
// Node with express:
getCookieValue('cookieName', req.headers.cookie)
// Browser:
getCookieValue('cookieName', document.cookie)
用express写入节点:
res.cookie('cookieName', 'cookieValue')
在浏览器中编写:
function setCookie(
cname,
cvalue,
exdays = 100 * 365 /* 100 days */
) {
const now = new Date()
const expireMs = exdays * 24 * 60 * 60 * 1000
now.setTime(now.getTime() + expireMs)
document.cookie = `${cname}=${cvalue};expires=${now.toUTCString()};path=/`
}
// Example of usage
setCookie('cookieName', 'cookieValue')