express Router对象

express如何使用在这里我就不多赘述了,你可以去看文档,有中文的,但我建议你直接看英文的,避免被中文的翻译质量和古老版本的文档坑。

我只想告诉你如何查阅以及分析源码,找到每个方法的入口,每个对象从何而来。

先来看express中Router的用法:

var express = require('express');
var router = express.Router();

router.get('/detail/:id', detail.detail)
router.get('/', index.home);

来看一下express的几本目录结构

test/
example/
lib/
    --- middleware/
    --- router/
    --- express.js
    --- request.js
    --- response.js
    --- application.js
    --- utils.js
    --- view.js
index.js
package.json

从一个包中直接导入模块,比如express = require("express")。没有指定到底是哪个文件,而是直接以包名的方式导入,那么解释器先搜索有没package.json文件,设置没有相关的设置,再搜索有没有index.js这个文件。

打开这个文件我们发现只有区区两行代码:

'use strict';
module.exports = require('./lib/express');

如果会Python的同学肯定似曾相识,这个index.js文件的作用不是和__init__.py差不多吗!我告诉你,差别还是有的!Python中的包必须有__init__.py以声明文件夹是个Python包。但Nodejs却不会强制每个包必须有index.js文件,只不过你需要以require("modulename")直接导入包的时候,解释器会搜索这个文件。

我们又把目标转向了lib目录下的express.js文件,可以不带.js后缀名,解释器会自动搜索。

这里不得不说一下module.exports这个特殊的模块组织方式了。

全局函数require导入一个包的时候,不会像其他语言一样将包中的东西全局导入,而只会导入module.exports这个模块,它默认是个空对象{}。我们常会看到有些包以这样的形式书写exports = module.exports = createApplication;exports其实是对module.exports的一个引用,因此如果把module.exports改变后,还需要把exports的引用也指向它,不然exports还是指向原来的对象。

来看一个例子:

module.js

exports.a = function a() {};
exports.b = function b() {};
exports.c = function c() {};
main.js

var m = reuqire('module.js');
console.log(m.a, m.b, m.c)

结果:

[Function: a] [Function: b] [Function: c]

现在你明白module.exports有什么作用了吧,并且你会喜欢上这种模块导入方式的,Nodejs只能导入module.exports这个对象,避免了作用域的污染。不像Python可以用from module import *这种即不直观又污染作用域的方式乱来。

好了,我们来看express.js文件,exports = module.exports = createApplication;

这个createApplication是个函数,返回值……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值