Articles of expression

IncomingMessage中止事件

在Node(4.2.3)中有这个基本的express(4.13.3)服务器。 //blah blah initialization code app.put('/', function(req, res) { req.on('close', function() { console.log('closed'); }); req.on('end', function() { console.log('ended'); }); req.on('error', function(err) { console.log(err); }); res.send(200); }); 然后我使用cURL来模拟file upload,如下所示: curl http://localhost:3000/ -X PUT -T file.zip 它开始上传(虽然没有任何反应),当它结束时,事件end 。 当我用Ctrl + C中止上传时,问题就开始了。 没有事件发生。 什么都没发生。 req对象从IncomingMessageinheritance,从而inheritanceReadable , Stream和EventEmitter 。 是否有任何事件发生这样的堕胎? 有什么方法可以知道客户端是否中止file upload? 首先编辑: User @AwalGarg提出了req.socket.on('close', function(had_error) {})但我想知道是否有任何解决scheme,这是不使用套接字?

在node.js中,如何使用socket.io设置redis并进行expression? 特别使用RedisStore()

第一个问题 我试图找出会议,商店,授权和redis。 如果重要,我使用Express@3.0.0rc4 。 我明白,我有两个select把我的RedisStore() 。 我使用哪一个? 我是否同时使用? express.session({secret: 'secret', key: 'key', store: new RedisStore()}); io.set('store', new RedisStore()); 我已经有了node.js , express和socket.io运行。 所以现在我试图实现redis但我不知道如何使用会话/存储实现授权,我不知道如何写入redis数据库。 我还没有find任何文件。 我发现一个网站,谈论会议和商店使用socket.io和快递,但没有redis,另一个谈到会议和商店使用所有三个 ,但它不使用io.set('store', …) 。 我也不知道是否应该使用两个不同的商店,一个用于express ,另一个用于socket.io ,或者如果我只使用一个。 看看这个例子来澄清: //Redis Variables var redis = require('socket.io/node_modules/redis'); var RedisStore = require('socket.io/lib/stores/redis'); var pub = redis.createClient(); var sub = redis.createClient(); var client = redis.createClient(); var redis_store […]

如何使用Express安全地上传Node中的文件?

在节点中有很多关于file upload的文章,教程和问题,但大部分是针对初学者的,并没有一个完全解释了如何保证file upload的生产。 我很努力地find一个完整的答案,但是没有成功。 以下是我的发现的解释。 限制上传的文件大小: app.use(express.limit('4mb')); 限制file upload到只有某些路线:我不能得到这个实际工作,但这里是我曾经试过: 更换: app.use(express.bodyParser()); 同 app.use(express.json()); app.use(express.urlencoded()); 并将多部分中间件添加到每个上载路由: app.post('/upload', express.multipart(), uploadController.uploadPhoto); 这部分不起作用,但如果我离开express.bodyParser() ,上传工作正常。 那么我做错了什么? 在保存上传到磁盘之前检查上传的文件types: 我无法弄清楚这一部分,但有一个build议是编写一个自定义中间件,使用强大的parsingfile upload,并试图调整文件的大小,然后保存(假设它是一个图像)使用图像魔术库。 build议这样做会使图像安全并确保它实际上是一个图像(因为如果图像不是图像,该过程将失败)。 这只会影响图像,所以它不是一个完整的解决scheme。 我怎样才能实现呢? 任何示例代码? 还有什么,我失踪上传是安全的?

bunyan log.child正确的用例?

我一直在看bunyanlogin我的nodejs应用程序。 我试了一下,似乎一切工作都很好。 我已经跳过了一个关于log.child 的部分 ,但现在我正在尝试了解如何使用它。 我认为这样做的目的是让我为日志条目指定一些特殊的标识符,以便我可以唯一地标识该日志如何与其他日志条目相关联。 如果是这样的话,我会设想自己在每个请求中使用log.child : var bunyan = require('bunyan'); var log = bunyan.createLogger({name: 'myapp'}); router.post('/submit', function(req, res) { var logChild = log.child({reqId: uuid.v4()}); logChild.info({ req:req }, req.user.name + ' has called /submit'); saveData(req) .then(function(data) { logChild.info({data: data}, req.user.name + ' has saved to DB successfully in /submit'); res.json({'success': 'Saved!'}); }) .error(function(err) { […]

为什么Express / Connect为每个请求生成新的CSRF令牌?

据我所知,有两种方法可以防止CSRF攻击:1) 每个会话令牌 ,2) 每个请求令牌 1)在第一种情况下,当用户会话初始化时,CSRF令牌只生成一次。 所以一次只有一个用户有效的令牌。 2)在第二种情况下,每个请求都会生成一个新的CSRF令牌,之后一个旧的无效。 由于攻击者窃取令牌(通过XSS) ,当用户转到下一页时,就会过期,从而使得难度更大。 但另一方面,这种方法使webapp不太可用。 这里有一个很好的来自security.stackexchange.com的引用: 例如,如果他们点击“后退”button,并提交新的值的forms,提交将失败,并可能用一些敌对的错误信息迎接他们。 如果他们尝试在第二个选项卡中打开资源,他们会发现会话在一个或两个选项卡中随机分配 在分析Node.js Express框架(基于Connect )的时候,我发现每个请求都会生成一个新的CSRF标记, 但是旧的标记不会失效 。 我的问题是 :为什么要在每个请求中提供新的CSRF标记,而不是使旧的无效? 为什么不只是每个会话生成一个令牌? 谢谢你,对不起我的英文!

Node Express中caching:白名单/黑名单视图如何?

Express有一个内置的caching机制,用app.enable('view cache')设置。 但是,如何区分应该caching的意见和应该始终保持新鲜的意见呢?

错误的JavaScript V8的正则expression式引擎时匹配的开始行?

我有一个非常漂亮的工具, 下划线 ,这是在打印出帮助/使用信息时得到最奇怪的行为。 在usage()函数中,我这样做来缩进文本块(例如,选项): str.replace(/^/, " "); 除了非常明显之外,这个正则expression式直接来自TJ Hollowaychuk的commander.js代码。 正则expression式是正确的。 然而,我在我的使用文本中间插入了一些bizzare空格。 喜欢这个: 命令: … 值检索对象属性的所有值。 扩展&ltobject>覆盖input数据中的属性。 默认值&ltobject>填写input数据中缺less的属性。 any&ltexp>如果input中的任何值使expression式为真,则返回“true”。 expression式参数:(值,键,列表) all&ltexp>如果input中的所有值都使expression式为true,则返回“true”。 expression式参数:(值,键,列表) isObject如果input数据是具有命名属性的对象,则返回“true” isArray如果input数据是数组,则返回“true” isString如果input数据是string,则返回“true” … 99%的机会,这是V8中的一个bug。 任何人都知道为什么会发生这种情况,或者最简单的解决办法是什么? 是的,事实certificate这是一个V8的错误,1748是确切的。 以下是我在该工具中使用的解决方法 : str.replace(/(^|\n), "$1 ");

有没有一个模块轻松地模拟req / res对象的unit testing连接样式处理程序?

我在node.js中编写了一个应用程序,其中包含一些连接样式端点处理程序(函数(req,resp)),并希望针对它们编写一些unit testing,而无需运行完整的应用程序。 我知道我可以“简单地”推动任何我手动写入的设备,但是我想知道是否有任何库可以帮助我更快地生成这些设备。 编辑:进一步解释我想要什么,我想在我的unit testing只执行我的处理程序(而不是我的应用程序),为此,我需要一个假的需求和水库。 那些是我想嘲笑的两件东西。 我目前正在使用摩卡作为testing运行器和核心断言模块。

查找一个string是否匹配一个模式

在我的应用程序的一个点上,我需要匹配一些模式的string。 假设一些示例string如下所示: 你好,约翰。 今天真是美好的一天! 今天可爱的日落,约翰,不是吗? 约翰,你今天会见琳达吗? 大多数(不是全部)这些string都来自预定义的模式,如下所示: “你好,%s。” 今天真是美好的一天!“ “今天可爱的日落,%s,不是吗? “你今天会开会吗,%s? 这个模式库不断扩大(目前在1,500左右),但手动维护。 inputstring虽然(第一组)很大程度上是不可预知的。 虽然他们中的大多数将匹配其中的一种模式,但其中一些不会。 所以,这是我的问题:给定一个string(从第一组)作为input,我需要知道哪些模式(已知第二组)它匹配。 如果没有任何匹配,它需要告诉我。 我猜测解决scheme涉及到从模式中构build一个正则expression式,并迭代地检查哪一个匹配。 不过,我不确定构build这些正则expression式的代码是什么样的。 注:我在这里给出的string是为了说明的目的。 实际上,这些string不是人类生成的,而是由我不能控制的系统在上面显示的计算机生成的人性化string。 由于它们不是手动input的,我们不需要担心types错误和其他人为错误。 只需要find匹配的模式。 注2:我可以修改模式库为其他格式,如果这样可以更容易地构造正则expression式。 当前的结构,printf样式%s,并不是一成不变的。

我应该使用Sails.js和Stormpath整合会话pipe理吗?

我正在调查使用Stormpath为我们的用户pipe理。 我目前有一个使用Node.js / Express.js的Sails.js应用程序。 目前,会话pipe理由默认的Sails.js框架处理,该框架严重依赖Express的会话中间件。 会话存储在生产中的共享Redis数据库中,以便我们可以保持多个API服务器无状态。 我的问题是两个会话pipe理系统是否会冲突和/或引起错误? 他们必须巩固还是可以安全地将他们分开? 如果他们必须合并,那么你如何configuration中间件? 作为一个说明,我们不会在Stormpath上存储很多用户数据,我们只会将它们用作auth / token提供程序。 谢谢您的帮助!