协慌网

登录 贡献 社区

在 Node.js 中,如何从其他文件中 “包含” 函数?

假设我有一个名为 app.js 的文件。很简单:

var express = require('express');
var app = express.createServer();
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.get('/', function(req, res){
  res.render('index', {locals: {
    title: 'NowJS + Express Example'
  }});
});

app.listen(8080);

如果我在 “tools.js” 中有一个函数怎么办?如何导入它们以在 apps.js 中使用?

或者...... 我应该将 “工具” 变成一个模块,然后需要它吗? << 似乎很难,我宁愿做 tools.js 文件的基本导入。

答案

您可以要求任何 js 文件,您只需要声明要公开的内容。

// tools.js
// ========
module.exports = {
  foo: function () {
    // whatever
  },
  bar: function () {
    // whatever
  }
};

var zemba = function () {
}

在您的 app 文件中:

// app.js
// ======
var tools = require('./tools');
console.log(typeof tools.foo); // => 'function'
console.log(typeof tools.bar); // => 'function'
console.log(typeof tools.zemba); // => undefined

如果尽管有其他所有答案,您仍然希望传统上在 node.js 源文件中包含一个文件,您可以使用:

var fs = require('fs');

// file is included here:
eval(fs.readFileSync('tools.js')+'');
  • 空字符串连接+''是将文件内容作为字符串而不是对象获取所必需的.toString()如果您愿意,也可以使用.toString() )。
  • eval()不能在函数内部使用, 必须在全局范围内调用,否则不能访问任何函数或变量(即不能创建include()实用程序函数或类似的东西)。

请注意,在大多数情况下,这是不好的做法 ,您应该编写一个模块 。但是,在极少数情况下,您本地上下文 / 命名空间的污染是您真正想要的。

更新 2015-08-06

还请注意,这不适用于"use strict"; (当您处于“严格模式” 时 ),因为执行导入的代码无法访问 “导入” 文件中定义的函数和变量。严格模式强制执行由较新版本的语言标准定义的某些规则。这可能是避免此处描述的解决方案的另一个原因。

您不需要新功能或新模块。如果您不想使用命名空间,则只需执行您正在调用的模块。

在 tools.js 中

module.exports = function() { 
    this.sum = function(a,b) { return a+b };
    this.multiply = function(a,b) { return a*b };
    //etc
}

在 app.js

或者像 myController.js 这样的任何其他. js:

代替

var tools = require('tools.js')强制我们使用命名空间并调用tools.sum(1,2);

我们可以简单地打电话

require('tools.js')();

然后

sum(1,2);

在我的情况下,我有一个控制器ctrls.js的文件

module.exports = function() {
    this.Categories = require('categories.js');
}

我可以在每个上下文中使用Categories作为公共类之后的require('ctrls.js')()