节点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)
又有什么意义? 看来, app
和express
正在传递到应用程序的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)
。