节点请求如何处理会话

时间:2017-10-18 09:36:25

标签: javascript node.js session request

我正在使用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);
        });
}

2 个答案:

答案 0 :(得分:1)

您应该将此功能用作中间件,然后将您要附加的内容附加到您的请求中

试试你的主脚本



'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




答案 1 :(得分:1)

我从未见过定义this.cookieJar。确保它已在某处初始化:

this.cookieJar = request.jar();

如果您只在应用程序中使用单个cookieJar,则还可以通过将jar选项设置为true来使用请求的全局Cookie jar:

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