NodeJS 快速会话无法在 Android 模拟器上运行
NodeJS express-session not working on Android emulator
我正在创建一个 Flutter 应用程序并想使用 express-session 添加登录。但是我在使用 Android 模拟器时无法正确 set/fetched 会话值时遇到一些问题。
服务器
const app = express();
const map = new Map();
const sessionParser = session({
saveUninitialized: false,
secret: '$eCuRiTy',
resave: false
});
app.use(sessionParser);
app.use(express.static('public'));
app.post('/login', function (req: any, res: any) {
console.log("enter login");
const id = uuid.v4();
console.log(`Updating session for user ${id}`);
req.session.userId = id;
res.send({ result: 'OK', message: 'Session updated' });
});
app.delete('/logout', function (req: any, response: any) {
console.log("enter logout");
console.log("Logout user:", req.session.userId);
const ws = map.get(req.session.userId);
console.log('Destroying session');
req.session.destroy(function () {
if (ws) ws.close();
response.send({ result: 'OK', message: 'Session destroyed' });
});
});
当我使用
从 Postman 调用上述 auth 函数时
- Post: http://localhost:7000/login
- 删除:http://localhost:7000/logout
我在日志中得到以下输出
- 输入登录名
- 正在为用户 1a9a9e62-e972-4a28-82d3-892d282b6321 更新会话
- 进入注销
- 注销用户:1a9a9e62-e972-4a28-82d3-892d282b6321
- 正在销毁会话
但是当我尝试使用以下代码从我的 flutter 应用程序中进行相同的调用时,我得到 req.session.userId
as undefined
static const url = "10.0.2.2:7000";
login() {
http.post(Uri.parse('http://$url/login'));
}
logout() {
http.delete(Uri.parse('http://$url/logout'));
}
- 输入登录名
- 正在更新用户 b0e9768e-b24c-4b1a-9a7c-a3fd58ef2ede 的会话
- 进入注销
- 注销用户:未定义
- 正在销毁会话
知道为什么我在使用模拟器时会出现 undefined 吗?
正如我在这个问题中看到的那样:“删除”动词不使用 Flutter 发送数据。可以在之前的link中看到@Roi Snir的回答,使用http包的.Request
方法用“delete”发送数据的方式
使用flutter时需要手动传递cookies,
所以我得到了一个小帮手class
现在我可以调用 post,通过 Session
class
获取等
class Session {
Map<String, String> headers = {};
Future<Map> get(String url) async {
http.Response response = await http.get(Uri.parse(url), headers: headers);
updateCookie(response);
return json.decode(response.body);
}
Future<Map> post(String url, dynamic data) async {
http.Response response =
await http.post(Uri.parse(url), body: data, headers: headers);
updateCookie(response);
return json.decode(response.body);
}
Future<Map> delete(String url) async {
http.Response response =
await http.delete(Uri.parse(url), headers: headers);
updateCookie(response);
return json.decode(response.body);
}
void updateCookie(http.Response response) {
String? rawCookie = response.headers['set-cookie'];
if (rawCookie != null) {
int index = rawCookie.indexOf(';');
headers['Cookie'] =
(index == -1) ? rawCookie : rawCookie.substring(0, index);
}
}
}
我正在创建一个 Flutter 应用程序并想使用 express-session 添加登录。但是我在使用 Android 模拟器时无法正确 set/fetched 会话值时遇到一些问题。
服务器
const app = express();
const map = new Map();
const sessionParser = session({
saveUninitialized: false,
secret: '$eCuRiTy',
resave: false
});
app.use(sessionParser);
app.use(express.static('public'));
app.post('/login', function (req: any, res: any) {
console.log("enter login");
const id = uuid.v4();
console.log(`Updating session for user ${id}`);
req.session.userId = id;
res.send({ result: 'OK', message: 'Session updated' });
});
app.delete('/logout', function (req: any, response: any) {
console.log("enter logout");
console.log("Logout user:", req.session.userId);
const ws = map.get(req.session.userId);
console.log('Destroying session');
req.session.destroy(function () {
if (ws) ws.close();
response.send({ result: 'OK', message: 'Session destroyed' });
});
});
当我使用
从 Postman 调用上述 auth 函数时- Post: http://localhost:7000/login
- 删除:http://localhost:7000/logout
我在日志中得到以下输出
- 输入登录名
- 正在为用户 1a9a9e62-e972-4a28-82d3-892d282b6321 更新会话
- 进入注销
- 注销用户:1a9a9e62-e972-4a28-82d3-892d282b6321
- 正在销毁会话
但是当我尝试使用以下代码从我的 flutter 应用程序中进行相同的调用时,我得到 req.session.userId
as undefined
static const url = "10.0.2.2:7000";
login() {
http.post(Uri.parse('http://$url/login'));
}
logout() {
http.delete(Uri.parse('http://$url/logout'));
}
- 输入登录名
- 正在更新用户 b0e9768e-b24c-4b1a-9a7c-a3fd58ef2ede 的会话
- 进入注销
- 注销用户:未定义
- 正在销毁会话
知道为什么我在使用模拟器时会出现 undefined 吗?
正如我在这个问题中看到的那样:“删除”动词不使用 Flutter 发送数据。可以在之前的link中看到@Roi Snir的回答,使用http包的.Request
方法用“delete”发送数据的方式
使用flutter时需要手动传递cookies,
所以我得到了一个小帮手class
现在我可以调用 post,通过 Session
class
class Session {
Map<String, String> headers = {};
Future<Map> get(String url) async {
http.Response response = await http.get(Uri.parse(url), headers: headers);
updateCookie(response);
return json.decode(response.body);
}
Future<Map> post(String url, dynamic data) async {
http.Response response =
await http.post(Uri.parse(url), body: data, headers: headers);
updateCookie(response);
return json.decode(response.body);
}
Future<Map> delete(String url) async {
http.Response response =
await http.delete(Uri.parse(url), headers: headers);
updateCookie(response);
return json.decode(response.body);
}
void updateCookie(http.Response response) {
String? rawCookie = response.headers['set-cookie'];
if (rawCookie != null) {
int index = rawCookie.indexOf(';');
headers['Cookie'] =
(index == -1) ? rawCookie : rawCookie.substring(0, index);
}
}
}