我想在用户输入应用程序时创建用户评论。并在需要时阅读会话。这是我的尝试
var io = require('socket.io'),
express = require('express');
querystring = require('querystring');
var app = express.createServer();
app.get('/', function(req, res){
var sessionVal = querystring.parse(req.url.substr(2));// sessionVal is an email for example: me@gmail.com
app.use(express.cookieParser());
app.use(express.session({ secret: sessionVal }));
});
var socket = io.listen(app);
socket.on('connection', function(client) {
client.on('message', function(message) {
// message will be an object {text:'user text chat blah blah', email:'me@gmail.com'}
// if the seesion stored, has the same value with message.email
// then the message will be broadcasted
socket.broadcast(message.text);
// else will not broadcast
});
});
app.listen(4000);
我需要在这里指出您错误地将中间件添加到应用程序中。该app.use
电话不应该内完成app.get
的请求处理程序,但它的外面。只需在之后直接调用它们createServer
,或查看文档中的其他示例。
您传递给的机密express.session
应该是字符串常量,或者应该是从配置文件中获取的机密。不要喂它客户可能知道的东西,这实际上很危险。只有服务器应该知道的秘密。
如果要在会话中存储电子邮件地址,只需执行以下操作:
req.session.email = req.param('email');
有了这个…
如果我理解正确,那么您想要做的就是处理一个或多个HTTP请求并跟踪会话,然后稍后打开一个Socket.IO连接,您还需要从中进行会话数据。
关于此问题的棘手问题是,Socket.IO的方法http.Server
可以通过劫持该request
事件来使魔术在任何事物上起作用。因此,永远不会在Socket.IO连接上调用Express(或Connect)的会话中间件。
我相信您可以通过一些技巧来完成这项工作。
您可以获取Connect的会话数据。您只需要获取对会话存储的引用。最简单的方法是在调用之前自己创建商店express.session
:
// A MemoryStore is the default, but you probably want something
// more robust for production use.
var store = new express.session.MemoryStore;
app.use(express.session({ secret: 'whatever', store: store }));
每个会话存储区都有一个get(sid, callback)
方法。的sid
参数,或会话ID,被存储在客户端上的cookie。该Cookie的默认名称为connect.sid
。(但是您可以通过key
在express.session
呼叫中指定选项来给它起任何名字。)
然后,您需要在Socket.IO连接上访问该cookie。不幸的是,Socket.IO似乎并没有授予您访问的权限http.ServerRequest
。一个简单的解决方法是在浏览器中获取cookie,然后通过Socket.IO连接发送它。
服务器上的代码将如下所示:
var io = require('socket.io'),
express = require('express');
var app = express.createServer(),
socket = io.listen(app),
store = new express.session.MemoryStore;
app.use(express.cookieParser());
app.use(express.session({ secret: 'something', store: store }));
app.get('/', function(req, res) {
var old = req.session.email;
req.session.email = req.param('email');
res.header('Content-Type', 'text/plain');
res.send("Email was '" + old + "', now is '" + req.session.email + "'.");
});
socket.on('connection', function(client) {
// We declare that the first message contains the SID.
// This is where we handle the first message.
client.once('message', function(sid) {
store.get(sid, function(err, session) {
if (err || !session) {
// Do some error handling, bail.
return;
}
// Any messages following are your chat messages.
client.on('message', function(message) {
if (message.email === session.email) {
socket.broadcast(message.text);
}
});
});
});
});
app.listen(4000);
假设您只想读取现有会话。您实际上无法创建或删除会话,因为Socket.IO连接可能没有HTTP响应来发送Set- Cookie
标头(请考虑使用WebSockets)。
如果要编辑会话,则可以在某些会话存储中使用。例如,CookieStore无效,因为它还需要发送一个Set- Cookie
标头,但它不能。但是对于其他商店,您可以尝试调用该set(sid, data, callback)
方法,看看会发生什么。
问题内容: 我能够创建这样的MySQL连接: 但是我想启动一个池并在我的项目中使用它。 问题答案: 只是为了将来帮助某人,这对我有用: 我创建了一个包含池的mysql连接器文件: 稍后,您可以简单地将连接器包含在另一个文件中,让其称为manageDB.js: 并做了这样的可调用方法:
本文向大家介绍nodejs使用express创建一个简单web应用,包括了nodejs使用express创建一个简单web应用的使用技巧和注意事项,需要的朋友参考一下 Express 在初始化一个项目的时候需要指定模板引擎,默认支持Jade和ejs。 这里我们使用ejs模板引擎:(关于ejs的介绍可以先从百科里面了解一个大概) EJS是一个JavaScript模板库,用来从JSON数据中生成HTM
问题内容: 我正在使用带有Express的nodeJS服务器来服务我的AngularJS应用程序。当我使用angularJS默认路由(hashbangs)时,所有这些都工作正常,但是现在我尝试激活html5模式。 我正在像这样激活html5mode: 这是我的nodeJS 文件的样子: 但是,这现在将所有请求用作我的文件,因此我从requireJS收到以下错误: 我尝试将以下内容添加到我的node
问题内容: 注意对于那些使用Redis挣扎的人,必须启动Redis服务器。 在Windows上,有一个redis发行版,请查看以下链接:https : //github.com/dmajkic/redis/downloads,然后通过启动“ redis-server.exe”来启动服务器。 我正在遵循有关node.js的教程。本教程使用Express和Redis。我安装了redis和connect
问题内容: 如何在JavaScript中创建和读取Cookie中的值? 问题答案: 这是可用于创建和检索Cookie的功能。
我是一名nodejs程序员。现在我有了一个我想以Excel文件格式保存的数据表。我该怎么做呢? 我找到了几个节点库。但大多数都是Excel解析器而不是Excel编写器。我使用的是Linux服务器。因此需要一些可以在Linux上运行的东西。请让我知道,如果有任何有用的图书馆,你知道。