2015-02-03 4 views
0

Я использую Node.js для запуска фоновых заданий (без интерфейса). Я думаю, что лучший способ для меня запустить рабочих - это иметь один файл для каждого вида работы (например, я могу легко запустить одного рабочего на сервер).Node.js включают JS-файл и заданные переменные

main.js

require('scribe-js')(); // github.com/bluejamesbond/Scribe.js 
process.console = console; 
... 

работник _ *. JS

require('./lib/main'); 

console.tag('testing').log('this is a test'); 

Переменная console не передается работнику _ *. JS. Я должен установить его в main.js, потому что, если значение переменной изменяется, я хочу иметь возможность изменять ее только один раз (в main.js), а не в каждом рабочем файле _ *. Js. Есть идеи?


Я думаю, что это не дубликат: Я знаю, что есть много «как мне включить файл JS в другой файл JS в Node.js», и ответ обычно «используют var s = require('yourfile');» , Я думаю, этот вопрос немного другой.

+0

Примечание: Я предпочел бы использовать мини-фреймворк, но большинство, например [Express] (http://expressjs.com/), сосредоточено на наличии интерфейса. Знаете ли вы о любой мини-каркасе? – iDev247

+0

Проблема в том, что для каждого из моих файлов 'worker _ *. Js' мне нужно было бы написать' process.console = globals.customConsole; 'вместо того, чтобы просто иметь его один раз в моем файле 'main.js'. Я пытаюсь найти решение, поэтому я определяю его только один раз, и он доступен всем работникам, которые включают 'main.js'.** изменить: ** странно, один из комментариев исчез – iDev247

+0

Я включил свой комментарий в ответ. Вот почему я удалил комментарий. – jfriend00

ответ

2

Чтобы разделить переменную между узловыми модулями, вы можете:

  1. Экспорт метод для модуля, а затем вызвать этот метод и передать его в переменную, которую вы хотите поделиться или
  2. Вы можете сделать переменную Глобальный.

Предпочтительный метод заключается в том, чтобы явно передавать переменную с помощью экспортированного метода, а затем позволить модулю сохранять свою собственную копию переменной. См. here для получения информации о глобалах.

В вашем случае может возникнуть большой смысл поддерживать общий конструктор для каждого работника и передать работнику объект, на который вы можете поместить свойства для совместного использования одних и тех же переменных каждому работнику.

Итак, вы бы так что-то вроде этого:

worker_1.js

var savedArgs; 
module.exports = function(args) { 
    savedArgs = args; 
} 

И тогда, когда worker_1.js был загружен, вы могли бы сделать это:

var args = {console: process.console}; 
require('./worker_1.js')(args); 

Дизайн модулей должен быть как можно более самодостаточным (например, не полагаться на глобальное состояние), чтобы стимулировать модульность и повторное использование ность. Они должны require() в том, что им нужно, и любая конфигурация приложения или синглтоны, которые им нужны для выполнения своей работы, которые создаются другими модулями, должны предоставляться им в их конструкторе или через какой-либо другой экспортированный метод.

+0

Второй блок кода будет main.js? Поэтому, включая worker_1.js в main.js, а не наоборот? – iDev247

+0

@ iDev247 - Я не следил за тем, как вы использовали worker_1.js. Я думал, что вы загружаете рабочих из одного центрального модуля, так что я его закодировал, но вы можете делать все наоборот. Вы можете загрузить общий модуль в рабочий и затем запросить его для однотонных данных, вызвав на нем экспортированный метод. Данные можно вытащить (вы вызываете чужой экспортированный метод для получения данных) или нажали (кто-то вызывает ваш конструктор и дает вам данные), в зависимости от того, как вы структурированы. В любом случае это нормально. – jfriend00

+0

Получил! Похоже, мне все равно нужно будет 'savedArgs.console.log()' вместо 'console.log()'. Это правильно? Мне бы очень хотелось найти решение, в котором я могу просто «console.log()», так что это универсальное изменение для всей отладки. – iDev247