节点JS,快速结构和需求混淆

这一直使我疯狂。 我是NodeJS的新手。 我很喜欢它,但有些东西一直把我扔掉。 我被递交给节点项目的一个非常基本的起点,我不确定如何search谷歌。

//myapp/server.js var config = require('./config'); var app = express(); var api = require('./app/routes/api')(app, express); // <-- this? app.use('/', api); var server = app.listen(3000, function () { console.log('\n============================'); console.log(' Server Running on Port 3000 '); console.log('============================\n'); }); 

然后是包含路由的api.js文件。

 //myapp/app/routes/api.js var config = require('../../config'); var mysql = require('mysql'); module.exports = function(app, express) { var api = express.Router(); api.all('/', function(req, res) {...}); api.all('/route-two', function(req, res) {...}); api.all('/another-route', function(req, res) {...}); return api; } 

理想情况下,我想把这里发生的事情分解成更有组织的结构,但是我想明白我在做什么。

令我困惑的主要是这条线

 var api = require('./app/routes/api')(app, express); 

我不知道你可以有没有一个()()彼此相邻. 或者join他们的东西。 有人可以解释发生了什么?

(app, express)又有什么意义? 看来, appexpress正在传递到应用程序的api部分,所以它的范围可以达到? 我走了吗?

如果有一个更清洁的方法,我很想得到一些见解。 我很欣赏任何想法。

谢谢!


编辑为了确保我了解…

 var api = require('require this file')(params available to this file); 

将任何需求从api.js移动到server.js然后将其作为参数

 var api = require('./app/routes/api')(config, app, express, mysql); 

编辑

经过@AhmadAssaf @Gurbakhshish Singh和@guy mograbi的更多有用的反馈

我想在另一个文件中使用的模块,而不是它们所require() ed,应该通过第二组()

 //.server.js var config = require('./config'); var app = express(); var api = require('./app/routes/api')(config, app, express); | | | _____________/______/________/ / / / //.app/routes/api.js | | | module.exports = function(config, app, express) { var api = express.Router(); // code to handle routes } 

这部分可能是错误的,但基于我认为我的理解。

 //.server.js var config = require('./config'); var app = express(); var register = require('./app/routes/register')(config, app, express); var login = require('./app/routes/login')(config, app, express); | | | _________________/______/________/ / / / //.app/routes/login.js | | | module.exports = function(config, app, express) {...handle login...} //.app/routes/register.js module.exports = function(config, app, express) {...handle registration...} etc. etc. 

希望我的想法是对的。 我感谢大家对此的帮助! 🙂

所以基本上你必须了解一些东西

  • module.exports封装了一个Javascript对象,并将其作为一个可插入的代码片段用于node.js应用程序
  • 封装的javascript对象可以是JSON对象,Javascriptvariables,函数等。

你在那里的模块是一个函数,它有两个参数。 当你需要那个模块的时候,你想传递一些构造函数给那个函数,那就是在第一个()模块名称后面使用second()

在你的程序中需要express一次并传递variables是或多或less的单例模式。 你也可以做的是传递config对象,以及api模块,而不是再次要求:)

 var api = require('./app/routes/api')(app, express); 

相当于:

 var myFunc = require('./app/routes/api'); var api = myFunc(app, express); 

并且由于NodeJS的模块加载过程,require('…')将被path中导出的代码所插入,它可以是一个对象,函数,简单variables等。

而就()()去require()nodeJS将使它像你的情况下函数(){}()这是有效的JavaScript,而非常有用的编写IIFE(立即调用函数expression式)代码

确定1

explain ()()

每一个函数可以返回一个函数的语言,你可以有这个语法。 想象下面

 function world(){ ... } function hello(){ return world; } // ===> hello()() // ==> would invoke hello and then world. 

所以当你看到require('..')()它意味着require('..')返回一个函数。 您可以通过编写以下内容来实现

 module.exports = function(){} 

该函数返回另一个函数 – 在你的情况下,这意味着express.Router(); 返回一个函数。

问题2

is there a cleaner way to write this?

这是一个很难回答的讨论。 取决于你的喜好。 我能想到的唯一的事情可能会帮助你find答案,就是使用快递生成器,看看快递团队使用的结构。这可能是干净的。

express可以用一些代码来为你生成一个项目。 只需使用npm install -g express安装它,然后运行express在您运行它的同一目录中为您生成项目。

检查生成的项目。 我build议遵循相同的模式 – 这就是我每当我开始一个项目时做的事情。

如果有些东西还不清楚,或者需要我详细说明,请发表评论,我将编辑答案。

module.exports的module.exports是一个函数,它有两个参数:app和express。 因此,当您在require('./app/routes/api')中的server.js中require('./app/routes/api') ,返回的值就是该函数。 因为它是一个函数,所以你可以通过在后面加括号来调用它,并传递它期望的参数(app和express),如下所示: require('./app/routes/api')(app, express)