Làm cách nào để đặt cookie trong nút js bằng khung express?


161

Trong ứng dụng của mình, tôi cần đặt cookie bằng khung express. Tôi đã thử đoạn mã sau nhưng không đặt cookie.

Bất cứ ai có thể giúp tôi làm điều này?

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);

Làm thế nào để bạn xác minh rằng cookie không được đặt? Bạn đã kiểm tra các tiêu đề phản hồi mà trình duyệt đang nhận được chưa?
NilsH

@NilsH tôi đã thêm log statement. Nếu nó được đặt có nghĩa là nó sẽ hiển thị dưới dạng 'cookie đã được tạo ra một cách dễ dàng' ..
sachin

1
ok, sau đó hoặc phần mềm trung gian của bạn không được gọi, hoặc một số câu lệnh trước đưa ra một ngoại lệ.
NilsH

nếu tôi xóa 'app.use (express.static (__ dirname +' / public '));' dòng này có nghĩa là nó đặt cookie
sachin

Câu trả lời:


216

Thứ tự mà bạn sử dụng phần mềm trung gian trong các vấn đề Express: phần mềm trung gian được khai báo trước sẽ được gọi trước và nếu nó có thể xử lý yêu cầu, mọi phần mềm trung gian được khai báo sau sẽ không được gọi.

Nếu express.staticđang xử lý yêu cầu, bạn cần di chuyển phần mềm trung gian của mình lên:

// 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'));

Ngoài ra, nhu cầu trung gian để một trong hai cuối một yêu cầu (bằng cách gửi lại một phản ứng), hoặc vượt qua các yêu cầu đến trung tới. Trong trường hợp này, tôi đã thực hiện việc sau bằng cách gọi next()khi cookie đã được đặt.

Cập nhật

Cho đến nay, trình phân tích cú pháp cookie là một gói npm riêng biệt, vì vậy thay vì sử dụng

app.use(express.cookieParser());

bạn cần cài đặt riêng bằng cách sử dụng npm i cookie-parservà sau đó sử dụng như:

const cookieParser = require('cookie-parser');
app.use(cookieParser());

Ngoài ra, tôi có thêm một câu hỏi làm thế nào tôi có thể kiểm tra xem cokkie có tồn tại hay không trước khi đặt cookie
sachin

Tôi đã chỉnh sửa câu trả lời của mình để chỉ cho bạn cách kiểm tra xem cookie đã được đặt chưa.
robertklep

1
Bạn có thể có một số tệp JS và / hoặc CSS trên trang của mình. Những người sẽ được xử lý bởi express.static, sẽ xử lý chúng sau phần mềm trung gian của bạn. Vì vậy, đối với mỗi tệp JS hoặc CSS, mã sẽ được gọi.
robertklep

1
Nó không đặt cookie 8 lần, nó nói cookie đã tồn tại. Đó là dự kiến.
robertklep

13
Lưu ý rằng trình phân tích cú pháp cookie nên được cài đặt riêng. Xem npmjs.com/package/cookie-parser
Joshua

117

Đặt cookie?

res.cookie('cookieName', 'cookieValue')

Đọc Cookie?

req.cookies

Bản giới thiệu

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('')

})

xin chào, bạn có thể nói những gì đã được ký: đúng không?
Titoih

nếu bạn đã khuyên đặt cookie làm dấu, điều quan trọng cần lưu ý là req.cookie sẽ trả về sản phẩm nào. Bạn chỉ có thể truy xuất cookie đã ký từ req.signCookies
Người nào đó đặc biệt

38

Không trả lời chính xác câu hỏi của bạn, nhưng tôi đã bắt gặp câu hỏi của bạn, trong khi tìm kiếm câu trả lời cho một vấn đề mà tôi có. Có lẽ nó sẽ giúp người khác.

Vấn đề của tôi là cookie đã được đặt trong phản hồi của máy chủ, nhưng không được trình duyệt lưu.

Phản hồi của máy chủ đã trở lại với bộ cookie:

Set-Cookie:my_cookie=HelloWorld; Path=/; Expires=Wed, 15 Mar 2017 15:59:59 GMT 

Đây là cách tôi giải quyết nó.

Tôi đã sử dụng fetchtrong mã phía khách hàng. Nếu bạn không chỉ định credentials: 'include' trong các fetchtùy chọn, cookie sẽ không được gửi đến máy chủ cũng như không được lưu bởi trình duyệt, mặc dù phản hồi của máy chủ đặt cookie.

Thí dụ:

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'
    })
})

Tôi hi vọng nó sẽ giúp ích cho mọi người.


Tôi đã kiểm tra yêu cầu bài đăng của mình trong trình duyệt nhưng lĩnh vực này không phù hợp với yêu cầu bài viết?
Sunil Garg

Nếu sử dụng XHR hoặc Jquery, thay vào đó, hãy sử dụng 'withCredentials: true'
rút phích cắm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.