Express 프레임 워크를 사용하여 노드 js에서 쿠키를 설정하는 방법은 무엇입니까?


161

내 응용 프로그램에서 Express 프레임 워크를 사용하여 쿠키를 설정해야합니다. 다음 코드를 시도했지만 쿠키를 설정하지 않았습니다.

누구든지 이것을 도와 줄 수 있습니까?

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

쿠키가 설정되어 있지 않은지 어떻게 확인합니까? 브라우저가받는 응답 헤더를 확인 했습니까?
NilsH

@NilsH 나는 로그 문을 추가했다. 만약 그것이 설정되면 '쿠키가 성공적으로 생성되었다'로 표시 될 것임을 의미한다 ..
sachin

1
그렇다면 미들웨어가 호출되지 않거나 이전 명령문 중 일부가 예외를 제공합니다.
NilsH

'app.use (express.static (__ dirname +'/ public '));'를 제거한 경우 이 줄은 쿠키가 설정되었음을 의미합니다
sachin

답변:


216

Express에서 미들웨어를 사용하는 순서는 중요합니다. 앞서 선언 한 미들웨어가 먼저 호출되고 요청을 처리 할 수있는 경우 나중에 선언 된 미들웨어가 호출되지 않습니다.

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

또한 미들웨어 는 요청을 종료 하거나 (응답을 다시 보내어) 요청을 다음 미들웨어로 전달해야합니다. 이 경우 next()쿠키가 설정되면 호출하여 후자를 수행했습니다 .

최신 정보

현재 쿠키 파서는 별도의 npm 패키지이므로 사용하는 대신

app.use(express.cookieParser());

npm i cookie-parser다음을 사용 하여 별도로 설치 한 후 다음과 같이 사용해야합니다.

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

또한 쿠키를 설정하기 전에 cokkie의 존재 여부를 확인할 수있는 방법이 하나 더 있습니다.
sachin

쿠키가 이미 설정되어 있는지 확인하는 방법을 보여주기 위해 답변을 편집했습니다.
robertklep

1
페이지에 JS 및 / 또는 CSS 파일이있을 수 있습니다. 이것들은 미들웨어 후에express.static 처리 할 것 입니다. 따라서 각 JS 또는 CSS 파일에 대해 코드가 호출됩니다.
robertklep

1
쿠키를 8 번 설정하지 않고 쿠키가 이미 존재한다고 말합니다. 어느 것이 기대됩니다.
robertklep

14
쿠키 파서는 이제 별도로 설치해야합니다. npmjs.com/package/cookie-parser
Joshua

118

쿠키를 설정 하시겠습니까?

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

쿠키를 읽으시겠습니까?

req.cookies

데모

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

})

안녕하세요, 서명 된 것을 말할 수 있습니까?
titoih

쿠키를 기호로 설정하도록 권고 한 경우, req.cookie는 빈 상태로 반환됩니다. req.signedCookies
누군가 특별한

38

귀하의 질문에 정확하게 대답하는 것이 아니라 귀하의 질문에 부딪히면서 제가 가진 문제에 대한 답변을 찾았습니다. 어쩌면 다른 사람을 도울 것입니다.

내 문제는 쿠키가 서버 응답으로 설정되었지만 브라우저에 의해 저장되지 않았다는 것입니다.

서버 응답에 쿠키가 설정되었습니다.

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

이것이 내가 해결 한 방법입니다.

fetch클라이언트 측 코드에서 사용 했습니다. 당신은 지정하지 않으면 credentials: 'include' 에서 fetch옵션, 쿠키는 어느 쪽도 서버로 전송되지 않고 저장 브라우저에 의해, 심지어는 서버 응답 세트 쿠키 생각된다.

예:

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

나는 이것이 누군가를 돕기를 바랍니다.


브라우저에서 게시물 요청을 검사했지만이 필드는 게시물 요청과 함께 진행되지 않습니까?
Sunil Garg

XHR 또는 Jquery를 사용하는 경우 대신 'withCredentials : true'를 사용하십시오
분리

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.