小编dsp*_*099的帖子

如何发送响应但继续在Sinatra执行?

我正在制作一个小型的sinatra应用程序.它会进行一些Redis调用,返回数据,然后进行最后的Redis调用以保存"统计信息".

到目前为止,如果我想提前终止请求(基于输入),我发现我可以使用暂停:

# code code
halt send_blank if is_blocked? SETTINGS, host
# code code
Run Code Online (Sandbox Code Playgroud)

在最后,我希望有这样的事情:

response.body = JSON.generate(outgoing)
# update user
STATISTICS.hset('u:' + userID, 'data', JSON.generate({'ip' => request.ip, 'time' => Time.now.to_f.to_s}))
Run Code Online (Sandbox Code Playgroud)

是否可以发送响应然后执行5~ms redis写入,以便客户端不必等待?无论我在何处或如何进行最终统计redis调用,它都会将响应的发送延迟几毫秒 - 无法欺骗sinatra.

这可以很容易地在Node中完成,但只是写下我想做的事情,它会在响应发送后触发; 据我所知,这里的代码会在拍摄回复之前阻止执行大约5ms.

我尝试使用after ... do过滤器,它们会正常工作,除了你不能传递给除了response.body中的数据之外的任何东西 - 意味着你不能将任何不会传递给过滤器的东西传递给它们输出!通过分配在帖子范围之外的变量("/")来避免这个问题是可能的,但是每秒有100多个请求,我希望你能看到通过"全局"类型交换数据如何成为一个巨大的问题.

看起来真的很简单,但我找不到比...更好的东西..在文档中做过滤器.

我可以创建一个线程或其他东西来使redis.hset()进程无阻塞,那会起作用吗?似乎喜欢黑客攻击它.

谢谢!

ruby performance rack sinatra redis

6
推荐指数
1
解决办法
1348
查看次数

是在请求之间共享的Sinatra路由中定义的全局变量吗?

说我有:

get '/' do
 $random = Random.rand()
 response.body = $random
end
Run Code Online (Sandbox Code Playgroud)

如果我每秒有数千个请求进入/,$ random会在上下文之外共享和"泄漏",还是会像get块的"本地"变量一样?

我想如果它是在它的上下文之外定义get '/' do它确实会被共享,但我想知道是否有一个我不知道的红宝石机制.

ruby routing sinatra

6
推荐指数
1
解决办法
6067
查看次数

是否可以知道用户在页面上花了多长时间?

假设我有一个浏览器扩展程序,它运行用户访问的JS页面.

是否有"outLoad"事件或类似事件开始计算并查看用户在页面上花了多长时间?

javascript jquery cross-browser google-chrome-extension

6
推荐指数
1
解决办法
7771
查看次数

构建特定复杂表单的最佳实践/模式

我正在为用户构建一个表单,以便能够查询mongoDB.用户必须能够添加他们自己的"条目",以便可以进行以下查询:

fieldA 等于 someValue

fieldB大于someValue fieldB小于otherValue

我希望params看起来如下:

{
  :r4nd0m => {
    :normal => ['someField', 'lte', 'someValue'],
    :or     => ['someField', 'gte', 'someValue']
  },
  :r4ndom_2 => {
    :normal => ['otherfield', 'is' '42179'],
    :or     => [] # Not filled
  }
}
Run Code Online (Sandbox Code Playgroud)

我怎么能命名input names来完成这个?有没有更好的方法从页面获取这样的复杂表单数据,还是我在正确的轨道上?

html forms input mongodb

6
推荐指数
1
解决办法
231
查看次数

多个 SSL 证书和 HTTP/2 与 Express.js

设想:

我有一个 express.js 服务器,它根据req.headers.host用户来自哪里来提供相同静态登录页面的变体- 有点像 A/B 测试。

GET tulip.flower.com 供应 pages/flower.com/tulip.html

GET rose.flower.com 供应 pages/flower.com/rose.html

同时,这个IP还负责:

GET potato.vegetable.com 服务 pages/vegetable.com/potato.html

重要的是这些页面的服务速度,因此它们以各种方式进行预编译和优化。

服务器现在需要:

  1. 为、、提供单独的证书*.vegetables.com*.fruits.com*.rocks.net
  2. 可选择不提供证书 *.flowers.com
  3. 提供 HTTP2

问题是 HTTP2 强制要求一个证书,现在有多个证书在起作用。

似乎可以在一个 Node.js(并且可能通过扩展 Express.js)服务器上使用多个证书,但是是否可以将它与像spdy这样的模块结合使用这样,如果是这样,如何?

而不是hacking node,把整理http2和SSL的任务交给nginx会不会更聪明?像 Imperva 或 Akamai 这样的缓存网络应该处理这个问题吗?

ssl nginx node.js express http2

6
推荐指数
2
解决办法
2490
查看次数

如何模拟对Web服务器的大量同时请求?

我想看看我的nginx + node.js设置可以走多远,以及我可以做出哪些改变来挤出额外的性能我偶然发现了一篇很好的文章,详细说明了可以对操作系统进行一些调整来承受更多请求(我不确定我完全理解)

假设我想看看它如何在一段时间内每秒处理60,000个请求.

我试过apachebench和beeswithmachineguns.apachebench似乎局限于大约3500个请求或其他东西.提高并发性只会以某种方式降低平均req/s.我能够看到(声称)每秒5000个请求到beeswithmachineguns的测试页面,但仍然没有接近我想要的.但是,似乎有点在马车方面.

有没有可靠的方法来模拟这样的大量请求?

debian tcp nginx stress-testing node.js

5
推荐指数
1
解决办法
2422
查看次数

没有插件的移动Facebook授权/操作的最佳实践

我正在使用Phonegap编写应用程序.

我想给用户一些额外的好处,如果他们愿意,可以在他们的墙上发布关于应用程序的信息(或类似的东西).

有一个整洁的Cordova插件,它非常彻底地涵盖了Facebook的功能,更重要的是,它看起来像它本身可以管理的那样.

但是,如果这样的插件不可用,那么拥有用户的高级概述是什么:

  1. 用FB授权
  2. 发布FB上的东西罐头
  3. 确定他们实际上发布了给他们的东西

我相信有一种方法可以使用Facebook的JavaScript SDK来做这些事情,但我从未见过应用程序问我的用户名和密码(这不是真正的Facebook应用程序)而且我不认为Facebook会满意那么,最好的方法是什么呢?

另外,如果我想让用户在我的应用程序中使用Facebook登录,(想想Tinder)我应该保存哪些数据?Facebook登录令牌和设备ID?在使用Facebook和电话数据识别和存储服务器端的用户帐户信息时,最佳做法是什么?

javascript android facebook ios cordova

5
推荐指数
1
解决办法
846
查看次数

使用node.js启用Couchbase N1QL引擎

我正在尝试使用couchbasenpm包运行一些N1QL查询。这是我在运行代码之前采取的步骤:

  1. 在OSX上安装并执行Couchbase
  2. 导航到:8091并设置凭据和beer-sample存储桶
  3. 将N1QL DP4下载到一个文件夹
  4. cbq-engine像这样启用: ./cbq-engine -datastore=http://localhost:8091
  5. 根据文档创建主索引

此时,我已经localhost:8091(主要的Couchbase集群)和localhost:8093(DP4引擎)都已上线。

这是我从node.js客户端使用的代码,以尝试运行简单的N1QL查询:

var colors = require('colors'); // for console.log
var couchbase = require('couchbase');
var N1qlQuery = require('couchbase').N1qlQuery; // get query object
var myCluster = new couchbase.Cluster('couchbase://localhost:8091'); // connect to live local cluster
var myBucket = myCluster.openBucket(); // open bucket
myBucket.enableN1ql(['http://localhost:8093/']); // enable n1ql as per documentation (http://docs.couchbase.com/developer/node-2.0/n1ql-queries.html) - I also tried :8091, same result
var query = N1qlQuery.fromString('SELECT * FROM …
Run Code Online (Sandbox Code Playgroud)

javascript nosql node.js couchbase sql++

5
推荐指数
1
解决办法
1568
查看次数

为什么Net:HTTP/HTTParty调用中断Watir-Webdriver脚本/ Net :: ReadTimeout错误

我已经设置了一个Watir-Webdriver脚本,我想向远程服务报告:

  puts "Starting..."

  b = Watir::Browser.new :ie
  puts "Started browser"

  puts "Setting status as non-idle"

  request = Net::HTTP::Post.new()
  url = URI(HOME + '/update_status')
  request.body = JSON.generate({ scrapeId: SCRAPE_ID, status: 'working' })
  # This step freezes processing
  Net::HTTP.start(url.host, url.port) {|http| http.request(request)}

  puts "This step never happens"
Run Code Online (Sandbox Code Playgroud)

同时,node.js/express watir正在ping以具有以下端点:

app.post('/update_status', function(req, res) {
  redis.hset(req.body.scrapeId, 'status', req.body.status);
  if (req.body.status === 'finished') {
    redis.expire(req.body.scrapeId, SIX_HOURS);
  }
  res.send('response from post /update_status');
});
Run Code Online (Sandbox Code Playgroud)

问题:为什么Net :: HTTP会在击中时超时/update_status?有趣的是,如果服务器返回404(端点不存在),Watir脚本将继续正常运行.

Net::ReadTimeout 显然是culrpit,但为什么呢?

ruby http watir node.js web-scraping

5
推荐指数
1
解决办法
172
查看次数

当从在引导时调度的永久脚本调用时,节点的spawn()以静默方式失败

这有点儿麻烦.这个问题很可能与服务器有关,因此我的第一个问题是AskUbuntu.

我正在尝试使用crontab或rc.local或init.d来启动永久脚本.它将服务器连接到一个端口,我可以ping一些信息并让它为我运行一个无头浏览器.

也就是说,我似乎无法得到Node.js的回复spawn():

var CASPER_PATH = '/home/ubuntu/dev/casperjs/bin/casperjs'; // actual binary location, not a symlink
var SCRIPTS_PATH = '/home/custom_user/endpoints/server.js';

var fileName = req.body.source + '_' + req.body.type + '.coffee'; // looks like: mysource_my_scrape_type.coffee
var scrapeId = 'test_scrape';
var user = 'user123';
var pass = 'pass123';
if (fs.existsSync(SCRIPTS_PATH + fileName)) {
  // If file is in place, spawn casperjs
  var sP = spawn(CASPER_PATH, 
    [SCRIPTS_PATH + fileName, '--ssl-protocol=any', '--user='+user, '--scrapeId='+scrapeId, '--pass='+pass], 
    { detached: true }, 
    function (err, …
Run Code Online (Sandbox Code Playgroud)

javascript linux node.js phantomjs casperjs

5
推荐指数
1
解决办法
321
查看次数