导航:首页 > 编程语言 > nodejssessionstore

nodejssessionstore

发布时间:2023-02-07 08:38:15

㈠ node怎么设置session

以下内容来自网络
node.js 是有windows实现版本的,请到它的官网node.org下载。有两种 exe和msi都可以使用。
下载后安装和正常软件安装一样。使用方法:
在开始菜单打开,选择 Node.js command prompt ,它自动帮你加入了环境变量,直接可以使用 node 和npm命令。
node命令: node (空格)js程序,请用绝对地址。其他参数可以用node -h查看,有详细的解释
npm命令:npm是node安装第三方模块的命令,使用非常简单npm install 模块名即可。其他参数可以可以使用npm -h 查看
这里npm的模块都必须在npm.org上注册使用。
另外在提供一个中文社区 cnodejs.org不错的中文社区。也提供中文文档。

还有一点关于平台选择,其实并不是linux好,node的核心事件驱动机制在linux使用的是模拟的libev+libeio库模拟的,而windows则本身就提供了系统调用,性能据测试过的人数据是windows占大优势的。当然这并不影响你在windows和linux使用node.js,他是完全跨平台的!

㈡ 如何给nodejs redis session 定时

这里所说的定时任务可以说是计时器任务,比如说用户触发了某个动作,那么从这个点开始过二十四小时要对这个动作做点什么。那么如果有 1000 个用户触发了这个动作,就会有 1000 个定时任务。于是这就不是 Cron 范畴里面的内容了。
举个最简单的例子,一个用户推荐了另一个用户,定一个二十四小时之后的任务,看看被推荐的用户有没有来注册,如果没注册就给他搞一条短信过去。Σ>―(〃°ω°〃)♡→
最初的设想
一开始是想把这个计时器做在内存里面直接调用的。
考虑到 Node.js 的定时并不是那么准确(无论是setTimeout还是setInterval),所以本来打算自己维护这个定时器队列。
又考虑到 Node.js 原生对象比较耗内存。之前用JSON对象存了一本字典,约十二万多的词条,原文件大概也就五六兆,用 Node.js 的原生对象一存居然有五六百兆的内存占用——所以打算这个定时器队列用 C++ 来写 addon。
考虑到任何时候插入的任务都有可能在已有的任务之前或者之后,所以本来想用 C++ 来写一个 小根堆 。每次用户来一个任务的时候就将这个任务插入到堆中。
如果按照上述方法的话,再加上对时间要求掐得也不是那么紧,于是就是一个不断的process.nextTick()的过程。
在process.nextTick()当中执行这么一个函数:
从小根堆中不断获取堆顶的任务并处理,一直处理到堆顶任务的执行时间大于当前时间为止。
继续process.nextTick()来让下一个 tick 执行步骤 1 中的流程。
所以最后就是一边往小根堆插入任务,另一边通过不断process.nextTick()消费任务的这么一个过程。
最后,为了考虑到程序重启的时候内存数据会丢失,还应该做一个持久化的事情——在每次插入任务的时候顺便往持久化中间件中插一条副本,比如 MySQL、MongoDB、Redis、Riak 等等任何三方依赖。消费任务的时候顺便把中间件中的这条任务数据给删除。
也就是说中间件中永远存的就是当前尚未完成的任务。每当程序重启的时候都先从中间件中把所有任务读取进来重建一下堆,然后就能继续工作了。
如果当时没有发现 Redis 的这个妙用的话,上述的流程将会是实现定时任务的流程了。
Redis 妙用
在 Redis 的 2.8.0 版本之后,其推出了一个新的特性——键空间消息( Redis Keyspace Notifications ),它配合 2.0.0 版本之后的SUBSCRIBE就能完成这个定时任务的操作了, 不过定时的单位是秒 。
Publish / Subscribe
Redis 在 2.0.0 之后推出了 Pub / Sub 的指令,大致就是说一边给 Redis 的特定频道发送消息,另一边从 Redis 的特定频道取值——形成了一个简易的消息队列
比如可以往foo频道推一个消息bar,那么就可以直接:
PUBLISH foo bar
javascript
var Redis = require("ioredis");
var sub = new Redis(/** 连接信息 */);
sub.once("connect", function() {
// 假设需要选择 redis 的 db,因为实际上们不会去污染默认的 db 0
sub.select(DB_NUMBER, function(err) {
if(err) process.exit(4);
sub.subscribe("foo", function() {
//... 订阅频道成功
});
});
});
// 监听从 `foo` 来的消息
sub.on("message", function(channel, msg) {
console.log(channel, msg);
});

Redis Keyspace Notifications
在 Redis 里面有一些事件,比如键到期、键被删除等。然后可以通过配置一些东西来让 Redis 一旦触发这些事件的时候就往特定的 Channel 推一条消息。
本文所涉及到的需求的话所需要关心的事件是EXPIRE即过期事件。
大致的流程就是给 Redis 的某一个 db 设置过期事件,使其键一旦过期就会往特定频道推消息,在自己的客户端这边就一直消费这个频道就好了。
以后一来一条定时任务,就把这个任务状态压缩成一个键,并且过期时间为距这个任务执行的时间差。那么当键一旦到期,就到了任务该执行的时间,Redis 自然会把过期消息推去,的客户端就能接收到了。这样一来就起到了定时任务的作用。
消息类型
当达到一定条件后,有两种类型的这种消息会被触发,用哪个需要自己选了。举个例子,删除了在 db 0 中一个叫foo的键,那么系统会往两个频道推消息,一个是del事件频道推foo消息,另一个是foo频道推del消息,它们小俩口被系统推送的指令分别等价于:
PUBLISH __keyspace@0__:foo del PUBLISH __keyevent@0__:del foo

其中往foo推送del的频道名为__keyspace@0__:foo,即是"__keyspace@" + DB_NUMBER + "__:" + KEY_NAME;而del的频道名为"__keyevent@" + DB_NUMBER + "__:" + EVENT_NAME。
配置
即使你的 Redis 版本达标了,但是 Redis 默认是关闭这个功能的,你需要修改配置文件来打开它,或者直接在 CLI 里面通过指令修改。这里就说说配置文件的修改吧。。
首先打开 Redis 的配置文件,在不同的系统和安装方式下文件位置可能不同,比如通过brew安装的 MacOS 下可能是在/usr/local/etc/redis.conf下面,通过apt-get安装的 Ubuntu 下可能是在/etc/redis/redis.conf下,总之找到配置文件。或者自己写一个配置文件,启动的时候指定配置文件地址就好。
然后找到一项叫notify-keyspace-events的地方,如果找不到则自行添加,其值可以是Ex、Klg等等。这些字母的具体含义如下所示:
K ,表示keyspace事件,有这个字母表示会往__keyspace@<db>__频道推消息。
E ,表示keyevent事件,有这个字母表示会往__keyevent@<db>__频道推消息。
g ,表示一些通用指令事件支持,如DEL、EXPIRE、RENAME等等。
$ ,表示字符串(String)相关指令的事件支持。
l ,表示列表(List)相关指令事件支持。
s ,表示集合(Set)相关指令事件支持。
h ,哈希(Hash)相关指令事件支持。
z ,有序集(Sorted Set)相关指令事件支持。
x ,过期事件,与 g 中的EXPIRE不同的是, g 的EXPIRE是指执行EXPIRE key ttl这条指令的时候顺便触发的事件,而这里是指那个key刚好过期的这个时间点触发的事件。
e ,驱逐事件,一个key由于内存上限而被驱逐的时候会触发的事件。
A ,g$lshzxe的别名。也就是说AKE的意思就代表了所有的事件。
结合上述列表就能拼凑出自己所需要的事件支持字符串了,在需求中只需要Ex就可以满足了,所以配置项就是这样的:
notify-keyspace-events Ex

然后保存配置文件,启动 Redis 就启用了过期事件的支持了。
实践
先说任务的创造者吧。由于这里 Redis 的事件只会传键名,并不会传键值,而过期事件触发的时候那个键已经没了,你也无法获取键值,加上主系统和任务系统是分布式的,所以就把所有需要的信息往键名塞。
一个最简单的键名设计就是任务类型 + ":" + JSON.stringify 化后的参数数组;更有甚者可以直接把任务类型替换成所需的函数路径,比如需要执行这个任务的函数在task/foo/bar文件下面的baz函数,参数arguments数组为[ 1, 2 ],那么键名的设计可以是task/foo/bar.baz:[1,2],反正只需要触发这个键,用不着去查询这个键。等到真正过期了任务系统接收到这个键名的时候再一一解析,得到需要执行task/foo/bar.baz这个消息,并且网函数里面传入[1,2]这个arguments。
所以当接收到一个定时任务的时候,得到消息、函数名、过期时间参数,这个函数
/** 假设 redis 是一个 ioredis 的对象 */
var sampleTaskMaker = function(message, func, timeout) {
message = JSON.stringify(message);
console.log("Received a new task:", func, message, "after " + timeout + ".");
// 这里的 uuid 是 npm 一个包
// 生成一个唯一 uuid 的目的是为了防止两个任务用了相同的函数和参数,那么
// 键名可能会重复并覆盖的情况
// uuid 的文档为 https://www.npmjs.com/package/node-uuid
//
// 这里的 ❤️ 是一个分隔符,冒号是分割 uuid 和后面内容的,而 ❤️ 是分割函数名
// 和消息的
var key = uuid.v1().replace(/-/g, "") +
":❤️" + func + "❤️" + message;
var content = "";
redis.multi()
.set(key, content)
.expire(key, timeout)
.exec(function(err) {
if(err) {
console.error("Failed to publish EXPIRE EVENT for " + content);
console.error(err);
return;
}
});
};

// assign 是 sugarjs 里面的函数
// 把 db 塞到字符串里面的 {db} 里去
var subscribeKey = "__keyevent@{db}__:expired".assign({ db: 1 });
// 假设 sub 是 ioredis 的对象
sub.once("connect", function() {
// 假设需要选择 redis 的 db,因为实际上不会去污染默认的 db 0
sub.select(1, function(err) {
if(err) process.exit(4);
sub.subscribe("foo", function() {
//... 订阅频道成功
});
});
});
// 监听从 `foo` 来的消息
sub.on("message", sampleOnExpired);

注意:这里选择 db 1 是因为一旦开启过期事件监听,那么这个 db 的所有过期事件都会被发送。为了不跟正常使用的 redis 过期键混淆,为这个事情专门用一个新的 db。比如在自己正常使用的 db 0 里面监听了,那么不是任务触发的过期事件也会传过来,这个时候解析的键名就不对了。
最后就是sampleOnExpired函数了。
var sampleOnExpired = function(channel, key) {
// UUID:❤️func❤️params
var body = key.split("❤️");
if(body.length < 3) return;
// 取出 body 第一位为 func
var func = body[1];
// 推出前两位,后面剩下的有可能是参数里面自带 ❤️ 而被分割,所以要拼回去
body.shift(); body.shift();
var params = body.join("❤️");
// 然后把 params 传入 func 去执行
// func:
// path1/path2.func
func = func.split(".");
if(func.length !== 2) {
console.error("Bad params for task:", func.join("."), "-", params);
return;
}
var path = func[0];
func = func[1];
var mod;
try {
mod = require("./tasks/" + path);
} catch(e) {
console.error("Failed to load mole", path);
console.error(e.stack);
return;
}
process.nextTick(function() {
try {
mod[func].apply(null, JSON.parse(params));
} catch(e) {
console.error("Failed to call function", path, "-", func, "-", params);
console.error(e.stack);
}
});
};

这个简易的架子搭好后,只需要去写一堆任务执行函数,然后在生成任务的时候把相应参数传给sampleTaskMaker就好了。Redis 会自动过期并且触发事件给sampleOnExpired函数,然后就会去执行相应的任务处理函数了

㈢ nodejs function 里面怎么用session

如果楼主所说的session丢失是指存在cookie中的session-id没有带上,楼主可以去看看xhr的withCredentials。

㈣ 怎么学习nodejs websocket

NodeJS貌似在一直升温。的确,从去年就一直开始关注NodeJS了,那个时候还是吴玺喆同学和我谈起这个事情~~~回头我就算变扫了一下,无非就是在服务器端运行的JS而已。使用JavaScript作为指令调用底层的C++,这个思维模式还是挺不错的,并且在服务器端执行的效果也非常理想。那个时候想养肥了再看看,结果不到半年时间NodeJs已经有了飞速的发展,各方面的组件,各方面的社区文章介绍都已经非常全面了。NodeJS并且已经退出了Windows版本的安装程序。极大的方便了开发者(之前是在Ubuntu环境下部署的)。
webSocket 是一个非常不错特性,与其说是Html5的功能,不如说是浏览器支持的功能。Html5只是一个规范草案,添加了canvas,header,footer,nav,silder等一系列更加优化的语义标签,而Geolocation,webSocket,localStore等都是浏览器厂商支持的结果。(概念不要混淆哦)正好趁着去学习的时间,做了一个NodeJS与webSocket的小例子。拿出来和各位共享一下。
webSocket 是 Html5 的一种新的协议。它实现了浏览器与服务器的双向通讯。webSocket API 中,浏览器和服务器端只需要通过一个握手的动作,便能形成浏览器与客户端之间的快速双向通道,使得数据可以快速的双向传播。

通过一次简单的握手,建立了客户端和服务器端的联系之后,服务器便可以主动推送信息给客户端,而不需要客户端的反复轮询请求。在之前已经有谷歌的工程师尝试使用iframe来实现次功能,具体细节这里就不谈了,请各位自行谷歌。
webSocket 服务器商用已经很多了,这里不用 php,java 而是使用最近热得发烫的 NodeJs 来作为案例解析。
安装了NodeJS之后,我们可以通过一行简单的插件命令来安装 socket 模块。
npm install socket
然后引入包和启动服务器代码
var http = require('http'),
io = require('socket.io'),
fs = require('fs');

//配置
var config = {
port : 8888
}
//创建服务器,监听端口。
http = http.createServer(handler);
http.listen(config.port);
//创建webscoket监听服务器
io = io.listen(http);

function handler(req, res) {
fs.readFile(__dirname+'/client.html',
function(err, data){
req.setEncoding(encoding="utf8");
res.writeHead(200);
res.end(data);
});
}
io.sockets.on('connection',function(socket){
//定义事件
socket.on('msg',function(data){
socket.broadcast.emit('user message',data);
});
});
然后我们来编写我们的客户端
<script src="http://192.168.39.154:8888/socket.io/socket.io.js"></script>
<script type="text/javascript">
var socket = io.connect('http://192.168.39.154:8888/');
//Comet
socket.on('user message', function(msg) {
msgbox(msg.msg);
});
//发送消息
function sendMsg() {
var inpt = document.getElementById('txtInput');
var str = inpt.value;
if(str.length==0){
inpt.className="error";
alert("请输入发送的消息内容");
return false;
}
inpt.className = "";
msgbox(str);
//发送消息至服务器的Scoket。
socket.emit('msg', {
msg : str
});
console.log('[client]' + str);
inpt.value = "";
inpt.focus();
}
以上就是核心源代码。

㈤ nodejs从session里拿用户名

首先,你需要在服务器端使用一个Session模块,比如Express的Session模块。

然后,在你的路由中,你可以访问req.session.username,这样就可以获取到用户名了。

例如:

app.get('/', function(req, res){
var username = req.session.username;
res.send('Hello ' + username);
});

㈥ 为什么nodejs里session没有secret配置项就会报错

secret 是必需的选项,这是用于签名会话ID cookie的密钥。这可以是单个密钥的字符串或专多个秘密的数组。如果属提供了一组密钥,只有第一个元素将用于签名会话ID cookie,而在验证请求中的签名时,将考虑所有元素。参考:https://github.com/expressjs/session

㈦ NodeJs中的cookie、Session-cookie

首次请求服务端会在响应的 headers 里边种下 Cookie ,再次请求服务,浏览器就会带上 Cookie ,
然后这样会存在一些问题,首先 Cookie 不能存太大,设置在浏览器端可以看到可以被修改,不是那么的安全。

正因为 Cookie 的弊端,所以我们能不能把重要信息保存在服务器, Cookie 中值保留简单的一个ID将来用于去服务器获取对应信息

那么接下来看下 Koa 中如何使用 Session-cookie 模式

当 httpOnly 设置为 true 的时候cookie ygc:sess 在浏览器中是无法读取的;
当 signed 设置为 true 的时候,会成对的出现 ygc:sess.sig ,它是 app.keys 和 ygc:sess 哈希的结果;防止被篡改;
哈希会满足几个条件 把不定长转换成定长,摘要,雪崩效应;

以上session放在本地,多个实例不能共享

㈧ node express session怎么用

1:存储到内存中
var session = require('express-session');
app.use(session({
secret: configs.sysconfig.sessionsecret,
key: configs.sysconfig.sessionsid,
cookie: {
secret: true,
expires: false
},
resave: true,
saveUninitialized: true
}));
2:存储到redis
app.use(session({
store: new RedisStore({
host: "127.0.0.1",
port: 6379,
db: "test_session"
}),
resave:false,
saveUninitialized:false,
secret: 'keyboard cat'
}))
3:存储到mongodb
app.use(session({
secret: config.session_opts.sessionsecret,
store: new MongoStore({
url: config.session_opts.db
}),
resave: true,
saveUninitialized: true
}));

㈨ 解决vue nodejs中cros跨域cookie和session失效的问题

很多童鞋会发现vue请求api接口的时候多个地址没法共享session,也就是session会丢失。我们知道session是基于cookie的,ajax请求没法共享session主要是因为cookie跨域引起的。cookie跨域如何解决呢?

㈩ PHP 与 NodeJS 如何共用 Session

PHP 与 NodeJS共用 Session的方法是PHP暴露一个Service,向Node提供Session数据。php_session.php?SID=xxxx

1、php代码:

<?php
function getSessionByID($SID) {
if (session_id()) {
// 关闭当前session
session_destroy();
}
// 初始化指定session
session_id($SID);
session_start();
// 返回操作接口更友好的JSON
// 必要的FLAG看这里 http://www.php.net/manual/en/json.constants.php
return json_encode($_SESSION);
}

header('Content-Type:application/json');
echo getSessionByID($_GET['SID']);
?>
2、node实现代码:
var request = require('request');
request('http://localhost/php_session.php?SID=xxxx', function(err, res, body) {
if (!err && res.statusCode == 200) {
// 根据需要使用body(json)
}
});

阅读全文

与nodejssessionstore相关的资料

热点内容
将ape导入iphone 浏览:107
js组合快捷键 浏览:174
linux系统盘默认挂在的文件夹 浏览:667
淘宝数据包如何操作上架 浏览:567
vb编程中输入cls是什么意思 浏览:81
linuxtime服务 浏览:184
疯狂安卓讲义第二版代码 浏览:420
老炮儿三小时版本下载 浏览:313
matlab怎么调试程序 浏览:2
winxp升级win7的危害 浏览:496
网络没连上却不可用是怎么回事 浏览:752
社区版本 浏览:738
怎么查微信公众号什么时候开通的 浏览:717
安装三菱编程闪退怎么回事 浏览:488
手机怎么创建word文件格式 浏览:694
c语言连接数据库 浏览:887
数据线粉色和白色哪个是正 浏览:775
vb编程应注意什么 浏览:855
js循环添加控件 浏览:615
学习计算机网络的作用 浏览:235

友情链接