*更新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を直接変更しても動作するようですが、別の関数に渡してそこで変更するときには表示されません。私はそれをすることができるはずです。なぜ仕事ではないのですか?それはすべてがプログラム的に行われ、クライアント(ブラウザ)を経由しないからです。