我目前在使用 Redis 作为我的 NodeJS-Express 应用程序的 session 存储时遇到了一些问题。在某些时候,当我的应用程序正在等待 mongoDB promise 响应查询时,Redis session 突然使整个应用程序崩溃。
_http_server.js:192
throw new RangeError(`Invalid status code: ${statusCode}`);
^
RangeError: Invalid status code: 0
at ServerResponse.writeHead (_http_server.js:192:11)
at ServerResponse.writeHead (/my_project_path/node_modules/on-headers/index.js:55:19)
at ServerResponse.writeHead (/my_project_path/node_modules/on-headers/index.js:55:19)
at ServerResponse.writeHead (/my_project_path/node_modules/on-headers/index.js:55:19)
at ServerResponse._implicitHeader (_http_server.js:157:8)
at ServerResponse.end (/my_project_path/node_modules/compression/index.js:102:14)
at writeend (/my_project_path/node_modules/express-session/index.js:261:22)
at Command.ontouch (/my_project_path/node_modules/express-session/index.js:348:11)
at Command.callback (/my_project_path/node_modules/connect-redis/lib/connect-redis.js:248:10)
at normal_reply (/my_project_path/node_modules/redis/index.js:721:21)
at RedisClient.return_reply (/my_project_path/node_modules/redis/index.js:819:9)
at JavascriptRedisParser.returnReply (/my_project_path/node_modules/redis/index.js:192:18)
at JavascriptRedisParser.execute (/my_project_path/node_modules/redis-parser/lib/parser.js:574:12)
at Socket.<anonymous> (/my_project_path/node_modules/redis/index.js:274:27)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.push (_stream_readable.js:134:10)
at TCP.onread (net.js:547:20)
我尝试了很多方法来拦截错误,但无济于事:它发生在我尝试的任何钩子(Hook)或 console.log 之外。我尝试搜索 google 和 stackOverflow,但我只能找到一些人错误地在他们自己的代码中发送零状态,而 express<->redis session 没有任何错误。
下面是我用来连接 Express 和 Redis 的代码:
const config = {...config data here...}
const session = require('express-session'); // version 1.15.3
const redis = require('redis'); // version 2.7.1,
const RedisStore = require('connect-redis')(session); // version 3.3.0
const redisClient = redis.createClient({
host: config.redisCache.host,
port: config.redisCache.port,
auth_pass: config.redisCache.token
});
redisClient.on("error", function (err) {
// This is never called
console.error("Redis Error " + JSON.stringify(err,null,2));
});
const sess = {
resave: false, // don't save session if unmodified
saveUninitialized: true,// don't create session until something stored,
secret: config.secrets.session,
store: new RedisStore({client:redisClient}),
logErrors: function(_err) {
// This is never called either
console.error('Session error:' + JSON.stringify(_err,null,2))
}
};
app.use(session(sess));
下面是我发送的两个请求。一,来 self 的客户端 AngularJS 应用程序,使服务器崩溃。另一个收到回复就好了,以解决我的困惑。
// AngularJS request - crashes server with above stacktrace
{
"host": "localhost:8082",
"connection": "keep-alive",
"content-length": "54",
"origin": "http://localhost:8082",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
"content-type": "application/json;charset=UTF-8",
"accept": "application/json, text/plain, */*",
"apptoken": "my_project_app_token",
"referer": "http://localhost:8082/",
"accept-encoding": "gzip, deflate, br",
"accept-language": "en-US,en;q=0.8,pt;q=0.6",
"cookie": "connect.sid=s%3A14363a00-6285-11e7-8c76-9366761bb151.1Yg2b6gsLR8uJ7OCwLshZDacMbNC3XASI4%2BxVlRZ%2BXg"
}
// PostMan request, works just fine! (??)
{
"host": "localhost:8082",
"connection": "keep-alive",
"content-length": "57",
"postman-token": "86a514cd-7c19-85ee-d831-3b032849d430",
"cache-control": "no-cache",
"origin": "chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
"apptoken": "my_project_app_token",
"content-type": "application/json;charset=UTF-8",
"accept": "*/*",
"accept-encoding": "gzip, deflate, br",
"accept-language": "en-US,en;q=0.8,pt;q=0.6",
"cookie": "connect.sid=s%3AdUYMmy7KkcUF-tS9eHHbOTgNW4YrKx92.elK9FAP6kuZ3aazh8Z5X8m1lSZX%2BO4sIcex0LLD7JBQ"
}
// For completeness' sake, here is the POST request body
{"phone":"9999999999999","email":"xxxxxx@xxxx.xxx.xx"}
任何能为我指明解决此崩溃或进一步调查方法的想法都将非常受欢迎!
->最佳答案
经过大量调试,我决定以最粗暴的方式更新我所有的 npm 包:
rm -rf node_modules 删除了我所有的依赖项package.json(没有“脱字符”或“大于”)npm install。应用程序的 session 再次开始工作! 希望这个问答可以帮助其他人解决这个奇怪的错误。
关于angularjs - 响应状态为零的 Express Redis session 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44988517/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
我想为我的Task模型创建一个status属性,该属性将按以下顺序指示它在三部分进度中的位置:打开=>进行中=>完成。它的工作方式类似于亚马逊包裹的交付方式:已订购=>已发货=>已交付。我想知道设置此属性的最佳方法是什么。我可能是错的,但创建三个独立的bool属性似乎有点多余。实现此目标的最佳方法是什么? 最佳答案 Rails4有一个内置的enummacro.它使用单个整数列并映射到键列表。classOrderenumstatus:[:ordered,:shipped,:delivered]end状态映射如下:{ordered:0,
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成