2

深入节点,我对包含的脚本如何访问主脚本方法或变量有疑问

例如,假设我在主脚本中启动了一个记录器对象,并且我包含了另一个需要访问记录器的 js 文件。在不将记录器注入包含的脚本的情况下,我该如何做到这一点。

//main node script

var logger = require('logger'),
    app = require("./app.js")

//app.js

function something(){
  //access logger here !!!!!!!
}

exports.something = something

希望清楚

谢谢

4

2 回答 2

3

尝试做:

//main node script

var logger = require('logger'),
    app = require("./app.js")(logger);

//app.js

var something = function (logger){
  logger.log('Im here!');
}

module.exports = exports = something;

编辑:

如果您想将主应用程序的代码拆分为不同的文件,在您的主脚本文件中,您可以执行以下操作:(这就是我将主 app.js 拆分为不同部分的方式)

// main app.js

express = require('express');
...

/* Routes ---------------------*/
require('./config/routes')(app);

/* Socket IO init -------------*/
require('./app/controllers/socket.io')(io);

/* Your other file ------------*/
require('./path/to/file')(app);
...


// config/routes.js

module.exports = function(app){

    app.configure(function(){
        app.get('/', ...);
        ...
    }
}


// app/controllers/socket.io.js

module.exports = function(io){
  // My custom socket IO implementation here
}

// ...etc

编辑2:

您的函数还可以返回一个 JS 对象,以防您想使用自定义脚本在主 app.js 上执行某些操作。

例子:

// main app.js

...

/* Some controller ---------------------*/
var myThing = require('./some/controller')(app);

myThing.myFunction2('lorem'); // will print 'lorem' on console
...


// some/controller.js
// Your function can also return a JS object, in case you want to do something on the main app.js with this require 

var helperModule = require('helperModule');

module.exports = function(app){

  var myFunction = function(){ console.log('lorem'); }

  // An example to export a different function based on something
  if (app.something == helperModule.something){
    myFunction = function() { console.log('dolor'); }  
  }

  return {
    myFunction: myFunction,
    myFunction2: function(something){
      console.log(something);
    }
  }
}

您还可以简单地导出函数或包含函数的对象,而无需发送任何参数,如下所示:

// main app.js

...
var myModule = require('./path/to/module');
myModule.myFunction('lorem'); // will print "lorem" in console
...


// path/to/module.js

module.exports = {
  myFunction: function(message){ console.log(message); },
  myFunction2: ...
}

基本上,您在 module.exports 中放入的任何内容都是在 require() 函数之后返回的内容。

于 2013-09-25T14:11:32.373 回答
1

module.exports 是require文件时返回的内容。在@DavidOliveros 示例中,这是一个接受appio作为参数的函数。该函数在 require 发生后立即执行。

如果您想将包含脚本的方法公开给主,请尝试以下操作:

// child.js
module.exports = function(app){
  var child = {};
  child.crazyFunction = function(callback){
    app.explode(function(){
      callback();
    });
  };

  child.otherFunction = function(){};
  return child;
};

// app.js
var express = require('express');
var app = module.exports = express();
var child = require('./child.js')(app);
app.get('/', function(req, res){
  child.crazyFunction(function(){
    res.send(500);
  });
});
于 2013-09-25T15:08:41.733 回答