Node JS,表达结构,需要混淆

Node JS, Express Structure and Require Confusion

本文关键字:JS Node 结构      更新时间:2023-09-26

这让我抓狂。我是NodeJS的新手。到目前为止,我很喜欢它,但有些事情让我很失望。我被交给了一个节点项目的基本起点,我不确定如何在谷歌上搜索它。

//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);

我不知道在没有.或其他东西加入的情况下,()()可以挨在一起。有人能解释一下发生了什么吗?

(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@Gurbakhhish 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对象、javascript变量、函数等

api模块中的函数有两个参数。当您需要该模块时,您希望将一些构造函数传递给该函数,这是在第一个((中使用模块名称后的第二个((

在程序中需要express一次并传递变量或多或少是一种单例模式。您还可以将config对象也传递给api模块,而不是再次要求它:(

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

相当于:

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

由于NodeJS的模块加载过程,require("…"(将为由在路径上导出的代码插入,它可以是对象、函数、简单变量等。

就((((而言,require((nodeJS将在您的情况下使其类似于function(({}((,这是有效的javascript,对于编写IIFE(立即调用函数表达式(代码非常有用

Quesiton 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?

这是一场讨论。。这很难回答。取决于您的喜好。我唯一能想到的可能帮助你找到答案的就是使用express生成器,看看express团队使用的结构。。这可能是最干净的。

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

检查生成的项目。我建议遵循同样的模式——每当我结束一个项目时,我都会这样做。

如果还有什么不清楚的地方,或者你需要我详细说明,请发表评论,我会编辑答案。

api.js中的

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