Nodejs express无法读取cookie
Nodejs express无法读取cookie
app.js文件
var express = require(‘express’);
var fs = require(‘fs’);
var app = express.createServer();
app.use(express.bodyParser());
app.use(express.cookieParser());
fs.readFile(’./home.html’, ‘utf-8’, function (error, data) {
if (error) {
console.log('读取文件 home.html 失败。');
throw error;
} else {
app.get('/', function (request, response) {
response.send(data);
});
}
});
app.post(’/’, function (request, response) {
if (request.cookies.name) {
response.send('cookie值:' + request.cookies.name);
} else {
var minute = 60;
response.cookie('name', request.body.name, {maxAge: minute});
response.send('cookie不存在!')
}
});
app.post(’/clear’, function (request, response) {
response.clearCookie('name');
response.send(‘cookie已清除’)
});
app.listen(3000);
console.log(‘服务开启!’);
home.html文件
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>useCookie</title>
</head>
<body>
<form action="/" method="post">
<input type="text" placeholder="用户名" name="name" />
<input type="submit" value="提交" />
</form>
<form action="/clear" method="post">
<input type="submit" value="clear" />
</form>
</body>
</html>
根据你提供的 app.js
和 home.html
文件内容,你的代码中存在一些问题导致无法正确读取和设置 Cookie。以下是改进后的代码以及相应的解释。
改进后的 app.js
var express = require('express');
var fs = require('fs');
// 创建应用实例
var app = express();
// 使用中间件解析请求体和 Cookie
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(express.cookieParser());
// 读取 HTML 文件并设置路由
fs.readFile('./home.html', 'utf-8', function(error, data) {
if (error) {
console.log('读取文件 home.html 失败。');
throw error;
} else {
app.get('/', function(request, response) {
response.send(data);
});
}
});
// 设置 POST 路由处理表单提交
app.post('/', function(request, response) {
if (request.cookies.name) {
response.send('cookie值:' + request.cookies.name);
} else {
var minute = 60 * 1000; // 将分钟转换为毫秒
response.cookie('name', request.body.name, { maxAge: minute });
response.send('cookie不存在!');
}
});
// 清除 Cookie 的路由
app.post('/clear', function(request, response) {
response.clearCookie('name');
response.send('cookie已清除');
});
// 监听端口
app.listen(3000, function() {
console.log('服务开启!');
});
解释
-
创建应用实例:
var app = express();
这里使用了
express()
来创建应用实例,而不是express.createServer()
。createServer()
方法已经被弃用。 -
中间件配置:
app.use(express.urlencoded({ extended: true })); app.use(express.json()); app.use(express.cookieParser());
express.urlencoded
用于解析 URL 编码的请求体。express.json
用于解析 JSON 格式的请求体。express.cookieParser
用于解析请求中的 Cookie。
-
读取 HTML 文件并设置路由:
fs.readFile('./home.html', 'utf-8', function(error, data) { if (error) { console.log('读取文件 home.html 失败。'); throw error; } else { app.get('/', function(request, response) { response.send(data); }); } });
读取
home.html
文件并在根路径/
返回该文件内容。 -
处理 POST 请求:
app.post('/', function(request, response) { if (request.cookies.name) { response.send('cookie值:' + request.cookies.name); } else { var minute = 60 * 1000; // 将分钟转换为毫秒 response.cookie('name', request.body.name, { maxAge: minute }); response.send('cookie不存在!'); } });
- 如果存在名为
name
的 Cookie,则返回其值。 - 否则,将表单提交的
name
值作为 Cookie 设置,并返回提示信息。
- 如果存在名为
-
清除 Cookie 的路由:
app.post('/clear', function(request, response) { response.clearCookie('name'); response.send('cookie已清除'); });
通过这些改进,你应该能够正确地读取和设置 Cookie。确保 home.html
文件路径正确,并且你的表单数据可以正确传递到后端。
写cookie,删除cookie没问题,但是读取不了请求时的cookie
代码应该没问题,测试了一下,每条路径都通过
你的这个问题解决了吗?
根据你的描述,问题出在 express
的使用方式上。在较新的版本中,express
库已经不再直接提供 createServer
方法。你可以使用原生的 http
模块来创建服务器,并且使用 express
来处理路由。
以下是修正后的代码示例:
app.js 文件
const express = require('express');
const http = require('http');
const app = express();
// 使用中间件解析请求体
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
// 使用 cookie 解析中间件
app.use(express.cookieParser());
app.get('/', (req, res) => {
const data = `
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>useCookie</title>
</head>
<body>
<form action="/" method="post">
<input type="text" placeholder="用户名" name="name" />
<input type="submit" value="提交" />
</form>
<form action="/clear" method="post">
<input type="submit" value="clear" />
</form>
</body>
</html>
`;
res.send(data);
});
app.post('/', (req, res) => {
if (req.cookies.name) {
res.send(`cookie值:${req.cookies.name}`);
} else {
const minute = 60 * 1000; // 单位转换为毫秒
res.cookie('name', req.body.name, { maxAge: minute });
res.send('cookie不存在!');
}
});
app.post('/clear', (req, res) => {
res.clearCookie('name');
res.send('cookie已清除');
});
const server = http.createServer(app);
server.listen(3000, () => {
console.log('服务开启!');
});
关键点解释
-
使用
express
和http
:express
只负责路由和中间件。http
用于创建 HTTP 服务器。
-
中间件:
express.urlencoded()
和express.json()
用于解析 POST 请求的数据。express.cookieParser()
用于解析 Cookie。
-
创建服务器:
- 使用
http.createServer(app)
创建 HTTP 服务器。
- 使用
-
路由处理:
/
路由返回一个表单。/
POST 路由处理提交的表单数据,并设置 Cookie。/clear
POST 路由清除 Cookie。
这样修改后,你的应用应该能够正确地读取和设置 Cookie。