2017-10-18 54 views
1

我對請求模塊使用了node.JS。節點請求如何處理會話

我的問題是,我需要在每個請求上對用戶進行身份驗證,因爲會話在.then((response) => {})塊之外被銷燬。

如何將創建的會話保存在類中供以後使用?

我嘗試了一切都沒有成功。

下面是一個不工作代碼片斷

login() { 
const getLoginUrl = 'https://www.demourl.com/' 
const postLoginUrl = 'https://www.demourl.com/account/login/' 

rp({ 
     url: getLoginUrl, 
     jar: this.cookieJar, 
     method: 'GET' 
    }) 
    .then((body) => { 
     var csrftoken = this.cookieJar.getCookies(getLoginUrl)[1].toString().split('=')[1].split(';')[0]; 

     var args = { 
      url: postLoginUrl, 
      json: true, 
      method: 'POST', 
      data: { 
       username: this.username, 
       password: this.password 
      }, 
      headers: { 
       'method': 'POST', 
       'path': '/account/login/', 
       'cookie': 'csrftoken=' + csrftoken, 
      }, 
      jar: this.cookieJar, 
      resolveWithFullResponse: true 
     } 

     rp(args) 
      .then((response) => { 
       //Here is a valid session 
       //But how can I use this session in different functions? 
       console.log('Post demourl.com/account/login success'); 
      }) 
      .catch((error) => { 
       console.log('Post demourl.com/account/login error: ', error); 
      }); 
    }) 
    .catch((error) => { 
     console.log('Get demourl.com error: ', error); 
     }); 
} 
+1

如果您正在使用:

this.cookieJar = request.jar(); 

如果你只在你的應用程序中使用一個單一的cookieJar,你也可以通過設置選項jartrue使用要求的全球餅乾罐express.js,請嘗試使用中間件https://expressjs.com/zh/guide/using-middleware.html。如果沒有,你可以有一個沒有任何路徑的中間件函數,它可以執行任何請求 –

回答

1

你應該使用這個功能作爲一箇中間件,然後附上你想在連接到您的REQ

嘗試在你的主腳本什麼都做

'use strict' 
 

 
const express = require('express'); 
 
const login = require('./login'); 
 
const app = express() 
 

 

 
app.use(login);// use this if you want all your routes to check login or put it in a specific route 
 

 
app.get('/', (req,res)=>{ 
 
//this route is only for loged in users 
 
}); 
 

 
const server = http.createServer(app).listen(process.env.PORT); 
 

 

 
module.exports = app;

,並在您登錄腳本

const login = (req, res, next) => { 
 
    const getLoginUrl = 'https://www.demourl.com/' 
 
    const postLoginUrl = 'https://www.demourl.com/account/login/' 
 

 
    rp({url: getLoginUrl, jar: this.cookieJar, method: 'GET'}) 
 
     .then((body) => { 
 
      var csrftoken = this.cookieJar.getCookies(getLoginUrl)[1].toString().split('=')[1].split(';')[0]; 
 

 
      var args = { 
 
       url: postLoginUrl, 
 
       json: true, 
 
       method: 'POST', 
 
       data: { 
 
        username: this.username, 
 
        password: this.password 
 
       }, 
 
       headers: { 
 
        'method': 'POST', 
 
        'path': '/account/login/', 
 
        'cookie': 'csrftoken=' + csrftoken, 
 
       }, 
 
       jar: this.cookieJar, 
 
       resolveWithFullResponse: true 
 
      } 
 

 
      rp(args) 
 
       .then((response) => { 
 
        res.loginResponse = response; // save the response for later use 
 

 
        console.log('Post demourl.com/account/login success'); 
 
        next(); 
 
       }) 
 
       .catch((error) => { 
 
        console.log('Post demourl.com/account/login error: ', error); 
 
        return res.send(error) //send the error 
 
       }); 
 
     }) 
 
     .catch((error) => { 
 
      console.log('Get demourl.com error: ', error); 
 
      return res.send(error) //send the error 
 
     }); 
 
} 
 

 
module.exports = login

+0

如果沒有中間件,那麼沒有辦法使用這個函數嗎? – Phil795

1

我從來沒有看到被定義this.cookieJar。確保它的地方初始化:

// Either by setting it as the default 
const request = require('request').defaults({jar: true}); 

// Or by setting it on each request 
request('www.example.com', { jar: true }); 
+0

這種方式適用於我,通常我只在默認情況下將其定義爲'var request = request.defaults({jar:true})' – Lai32290