在服务运行之前,Node.js脚本应该等待
我有一个node.js脚本,在启动时启动。 它使用node-redis为Redis创build一个客户端,但在启动时,Redis尚未准备好,而节点已经启动。 所以,它会发出exception并停止执行。
第一部分是这样的:
var redis = require("redis"), jobs = require("jobs"), client = redis.createClient(), runner = new jobs(client, "job-queue",{}); // Continue using runner
第3行( redis.createClient()
)引发exception。
我的解决scheme是做一个无限循环,在try / catch中创build客户端,并在成功时停止循环:
var redis = require("redis"), jobs = require("jobs"), queue = 'job-queue', client = null, runner = null, createClient = function (redis, jobs, queue) { try { client = redis.createClient(); return new jobs(client, queue, {}); } catch (err) { return null; } }; while(true) { setTimeout(function() { runner = createClient(redis, jobs, queue); }, 1000); if (null !== runner) break; } // Continue using runner
几秒钟后,这是输出:
FATAL ERROR: JS Allocation failed - process out of memory
我该如何解决这个问题? 我正在寻找一个可以在PHP中的解决scheme:
while (true) { $client = createClient($redis, $jobs, $queue); if ($client instanceof MyClient) break; else sleep(1); }
setTimeout
是asynchronous的 。 JavaScript(和Node.js)有很less的function,在继续之前等待事情发生(如sleep
)。 相反,执行继续到下一行,但你传递setTimeout
一个callback函数,当它触发时运行。
我会做这样的事情(警告,未经testing):
var redis = require("redis"), jobs = require("jobs"), queue = 'job-queue'; function initializeRedis(callback) { (function createClient(){ var runner; try { client = redis.createClient(); runner = new jobs(client, queue, {}); } catch (e) {} if (runner){ callback(runner); } else { setTimeout(createClient, 1000); } })(); }; initializeRedis(function(runner){ // Continue using runner });
- 我应该完全消除从我使用的代码(Bluebird)承诺的try / catch?
- 摩卡/ Node.js / PostgreSQL集成testing
- 可能的问题与Muller? 错误:Router.use()需要callback
- Nodejs:将string转换为缓冲区
- nodejs request.url.match(regexp)似乎除了匹配之外还返回匹配的一个子string
- 未捕获错误:热模块更换已禁用
- 如何将一个包含样式标签的string作为原始文件添加到文件头中?
- Express.js服务器error handling(404)。 在我被允许处理错误之前,服务器就会发出exception并抛出exception
- Webstorm node.js远程debugging不会跳转到断点