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>  
&lt;meta charset="utf-8" /&gt;  

&lt;title&gt;useCookie&lt;/title&gt;  

</head>

<body>

&lt;form action="/" method="post"&gt;  

    &lt;input type="text" placeholder="用户名" name="name" /&gt;  

    &lt;input type="submit" value="提交" /&gt;  

&lt;/form&gt;  

&lt;form action="/clear" method="post"&gt;  

	&lt;input type="submit" value="clear" /&gt;  

&lt;/form&gt;  

</body>

</html>


5 回复

根据你提供的 app.jshome.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('服务开启!');
});

解释

  1. 创建应用实例:

    var app = express();
    

    这里使用了 express() 来创建应用实例,而不是 express.createServer()createServer() 方法已经被弃用。

  2. 中间件配置:

    app.use(express.urlencoded({ extended: true }));
    app.use(express.json());
    app.use(express.cookieParser());
    
    • express.urlencoded 用于解析 URL 编码的请求体。
    • express.json 用于解析 JSON 格式的请求体。
    • express.cookieParser 用于解析请求中的 Cookie。
  3. 读取 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 文件并在根路径 / 返回该文件内容。

  4. 处理 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 设置,并返回提示信息。
  5. 清除 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('服务开启!');
});

关键点解释

  1. 使用 expresshttp:

    • express 只负责路由和中间件。
    • http 用于创建 HTTP 服务器。
  2. 中间件:

    • express.urlencoded()express.json() 用于解析 POST 请求的数据。
    • express.cookieParser() 用于解析 Cookie。
  3. 创建服务器:

    • 使用 http.createServer(app) 创建 HTTP 服务器。
  4. 路由处理:

    • / 路由返回一个表单。
    • / POST 路由处理提交的表单数据,并设置 Cookie。
    • /clear POST 路由清除 Cookie。

这样修改后,你的应用应该能够正确地读取和设置 Cookie。

回到顶部