Node JS,表达结构,需要混淆
Node JS, Express Structure and Require Confusion
这让我抓狂。我是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)
的意义何在?似乎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@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
-它将在运行它的同一目录中为您生成项目。
检查生成的项目。我建议遵循同样的模式——每当我结束一个项目时,我都会这样做。
如果还有什么不清楚的地方,或者你需要我详细说明,请发表评论,我会编辑答案。
module.exports
是一个函数,它接受两个参数:app和express。因此,当您使用require('./app/routes/api')
在server.js中require
时,返回的值就是该函数。由于它是一个函数,您可以通过在它后面放括号来调用它,并传递它所期望的参数(app和express(,比如:require('./app/routes/api')(app, express)
。
- 在索引.html和应用.js [node.js] 之间共享变量
- JS(node.js)而循环不起作用
- 如何使用 JS (Node.js) 防止 HTTP 查询中允许使用 UTF8 字符串
- Angular JS & Node Webkit Routing
- 当作为脚本运行时.js Node中“this”的上下文是什么
- JS/Node:- 使用 node.io 选择标记
- JavaScript 如何让节点在返回 node.js/Node-RED 之前等待
- 处理快速连续的函数调用 - Javascript / underscore.js / node.js
- 如何在一台服务器中运行不同的.js文件.js NODE JS中的文件
- JS node-mysql bools 表现得很奇怪
- Node.js+Node Webkit+基于Node串行端口的应用程序-这可能吗
- 如何在Express.js/Node.js中检查查询字符串是否有值
- Express.Js, Node.Js, MongoDB Questions
- 在JS/Node中,当多个人编辑相同的记录时,如何避免数据冲突?有图案吗
- 服务器端js(node.js)上的同步
- 将参数从jade发送到js/node
- angular.js+node.js/electron中的Promise;不起作用
- 是否有可能确定我的应用程序的aws实例使用js/node aws-sdk
- Image Magick模块抛出奇怪的错误(Express js Node js)
- 用JS (Node.js)读取文本文件'