【发布时间】:2018-05-11 05:33:00
【问题描述】:
node.js 的新手我正在尝试在模块的子进程中执行一些代码。
让我解释一下,我在 index.js 中有我的简单服务器
var server = http.createServer(handleRequest);
server.listen(PORT, function(){
console.log("Server listening on: http://localhost:%s", PORT);
});
当一个 url 被获取时,我启动一个子进程:
function handleRequest(req, res){
console.log('Request path = ' + req.url)
launchWorker(req.url)
res.end('Path Hit: ' + req.url);
}
// workers execution
function launchWorker(path) {
const worker = child_process.spawn('node', ['./worker.js', path.substring(1)])
worker.stdout.on('data', function(data) {
console.log('worker: ' + data.toString())
});
worker.stderr.on('data', function(data) {
console.log('stderr : ' + data)
});
worker.on('close', function(code, signal) {
console.log('child process exited with code: ' + code)
});
}
所以我有一个执行一些代码的 worker.js 文件,我设法使用 ['./worker.js', path.substring(1)] 将一些数据从我的服务器传递到我的子进程
我使用 firebase 执行一些操作,所以在我的 worker.js 中我初始化了我的 firebase 管理员、凭据和数据库:
var admin = require("firebase-admin");
var serviceAccount = require("./service_account.json");
var defaultApp = admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "http://myAdress.firebase"
});
var db = admin.database()
performWork()
function performWork() {
var arg = process.argv[2]
var ref = db.ref("something");
ref.once("value", function(snapshot) {
console.log(arg);
process.exit(1);
});
}
我将每分钟启动一个进程,所以我想做的是给我的孩子作为参数的 firebase 数据库,所以我不会在每次启动进程时创建对 firebase 的访问。 所以这就是我在 index.js 中尝试做的:
var admin = require("firebase-admin");
var serviceAccount = require("./service_account.json");
var defaultApp = admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "http://myAdress.firebase"
});
var db = admin.database()
...
function launchWorker(path) {
const worker = child_process.spawn('node', ['./worker.js', path.substring(1), admin.database()])
我只是将数据库作为参数传递给我的工作人员。 然后在我的工人身上,我得到了 fb:
function performWork() {
var arg = process.argv[2]
var db = process.argv[3]
var ref = db.ref("something");
ref.once("value", function(snapshot) {
console.log(arg);
process.exit(1);
});
}
但是当我到达一个网址时,我得到一个错误:
TypeError: db.ref is not a function
at performWork (/home/user/worker.js:12:15)
at Object.<anonymous> (/home/user/worker.js:6:1)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
at Module.load (module.js:554:32)
at tryModuleLoad (module.js:497:12)
at Function.Module._load (module.js:489:3)
at Function.Module.runMain (module.js:676:10)
at startup (bootstrap_node.js:187:16)
at bootstrap_node.js:608:3
我认为worker.js根本不知道firebase,并且无法访问函数.ref。即使 db 不为空(我可以打印它的值) 所以我的问题是我需要在 worker.js 中导入/执行什么操作,以便它可以从 firebase 模块执行代码?我尝试用户要求...但没有任何效果。 我的问题也更笼统,我想在另一个文件中编写一些帮助程序(创建、读取、删除),但我会遇到同样的问题。 感谢您的任何帮助。
【问题讨论】:
-
为什么你认为有必要使用子进程?我没有看到任何暗示它们是必要的东西,并且使用子进程会带来不可忽略的性能损失。
-
我需要使用子进程来释放内存,这是一个经常调用的繁重任务,这是我发现进程完成后真正释放内存的唯一方法。
标签: javascript node.js firebase firebase-realtime-database