2017-12-21 5 views
0

*更新Node.JS client-sessions:セッションは持続しません。ファンクションへのリクエストの受け渡し

実際には、変更が発生した単一のルートに対してのみ持続します。

app.use(cors({ 
    credentials: true, 
})); 
app.options('*', cors()); 

app.use(function(request, response, next) { 
    response.header("Access-Control-Allow-Origin", "*"); 
    response.header("Access-Control-Allow-Headers", "X-Requested-With"); 
    next(); 
}); 

ので、私は(ノードAPI)急行JSを使用していないことだし、私が持っている:リクエストセッションは、私はこれを追加しようとしたが、何の葉巻...アプリ全体を通して

永続的です私は、各ルートの特定の関数を呼び出すと、私はこのように、その機能にリクエストオブジェクトを渡すデザインパターン:

const express = require('express'); 
const client_sessions = require('client-sessions'); 
const brain = require('./brain'); // custom module 
const chamber = require('./chamber'); 

const app = express(); 

app.use(client_sessions({ 
    cookieName: 'session', 
    secret: chamber.app_secret, 
    duration: 30 * 60 * 1000, 
    activeDuration: 5 * 60 * 1000, 
    cookie: { 
     httpOnly: false, 
     secure: false, 
     ephemeral: false 
    } 
})); 

app.put('/signup', function(request, response) { 
    brain.sign_up(request) 
    .then(obj => { return response.json(obj) }) 
    .catch(obj => { return response.json(obj) }); 
}); 

と脳のモジュールでは、サインアップ機能は、次のようになります。

function sign_up(request) { 
    return new Promise((resolve, reject) => { 
    var { username, email, password } = request.body 

    if(!username || !email || !password) { 
     return reject({error: true, message: "username, email and/or password not provided..."}) 
    } 
    if(typeof(username) !== 'string' || typeof(email) !== 'string' || typeof(password) !== 'string') { 
     return reject({error: true, message: "username, email and password must be of type string..."}) 
    } 

    var check_username = models.Users.findOne({ where: { username } }); 
    var check_email = models.Users.findOne({ where: { email } }); 

    Promise.all([check_username, check_email]) 
    .then(values => { 
     // console.log("signup checks: ", values); 
     var username_result = values[0] ? values[0].get({plain: true}) : false; 
     var email_result = values[1] ? values[1].get({plain: true}) : false; 

     if(username_result) { return reject({error: true, message: "username is taken..."}); } 
     if(email_result) { return reject({error: true, message: "email already in use..."}); } 

     models.Users.create({ username, email, password: bcrypt.hashSync(password) }) 
     .then(user_data => { 
     var { id, email, username, date_created, uniqueValue, bio, link, icon } = user_data.dataValues; 
     var user = { id, email, username, date_created, uniqueValue, bio, link, icon }; 
     var session_id = chamber.uniqueValue(); 

     request.session.id = session_id; 
     request.session.user = user; 

     console.log("session --- ", request.session); 
     return resolve({ user, session_id, message: "Signed Up!", online: true }); 
     }) 
     .catch(error => { 
     console.log("error: ", error); 
     return reject({error: true, message: "error processing data..."}); 
     }) 
    }) 
    .catch(error => { 
     console.log("error: ", error); 
     return reject({error: true, message: "error fetching data..."}); 
    }) 
    }); 
} 

問題は、要求がセッション間で持続しないことです。私はいくつかのトラブルシューティングを行いました。それは、アプリケーションルートコールバック関数でrequest.sessionを直接変更しても動作するようですが、別の関数に渡してそこで変更するときには表示されません。私はそれをすることができるはずです。なぜ仕事ではないのですか?それはすべてがプログラム的に行われ、クライアント(ブラウザ)を経由しないからです。

答えて

0

多くの読書や研究をしてから、開発者が何度もやりなければならないことがありましたが、私は問題と解決策を見つけました。明示的なアプリケーションは、現在のセッションを使用するのではなく、全く新しいセッションを作成するので、私がapiに送信した要求には信任状が含まれていませんでした。 javascriptでfetch APIを使用する人にとって、fetch()にはデフォルトで資格が含まれていません。 、AJAX呼び出しを行う第二引数(object)このキーと値のペア---資格情報を持っていることを確認するには:

let params = { 
    method: "GET", 
    credentials: "include" 
    } 

    fetch($vault.api_domain + "/signout", params) 
    .then(resp => resp.json()) 
    .then(json => { 
    self.session = json; 
    return resolve(json); 
    }) 
    .catch(error => { 
    console.log("error:", error); 
    return reject({error: true, message: "error fetching..."}); 
    }); 

ので、このような何か「が含まれます」

関連する問題