npm install -g express-generator
-g
参数来将其安装为全局位置,因为这个样子我们就能将其安装后生成的可执行程序添加到环境变量中了。express -e first-app && cd first-app
,其中命令中-e
参数是说使用 ejs 模板引擎来渲染视图。 first-app
就是我们生成程序生成的目录,紧接着我们通过 cd
命令进入了这个目录。最后我们运行 npm install
命令来安装所需依赖。 最终在图形化界面中进入这个目录,会看到如下文件列表:middlewave(也翻译为中间件)
机制进行的,即网络请求先经过第一个middlewave,如果处理完成则直接返回,否则调用 next()
函数将当前请求丢给下一个middlewave进行处理。我们看到app.js中有很多 app.use
函数的调用,正是这个函数配置了一个个的middleware。
其中app.use(bodyParser.json());
处理请求头为application/json
的数据,其实这个 middleware 一般用不到,除非是直接通过 post 方式来提交 JSON 字符串。app.use(bodyParser.urlencoded({ extended: false }));
这句话是处理form表单数据的,这个用处就大了,我们在 html 中的 method 属性为 post 的 form 表单,提交后的数据就会走到这个 middleware 进行处理,处理完成后就能通过 req.body 来读取表单中的数据了。app.use(cookieParser());
是用来处理cookie的,没有这个 middleware 的话,无法读取 http 请求中的cookie数据。app.use(express.static(path.join(__dirname, 'public')));
是定义从 public
路径读取静态文件。之前讲过当前项目目录中存在public
文件夹,假设我们在其下 javascripts
目录中放置一个 jquery.js
文件,那么我们在html中就可以这么引用这个静态文件:<script type="text/javascript" src="/javascripts/jquery.js"></script>
routes/index.js
文件:在express 3.x中,定义路由需要使用到在app.js
中定义的app
对象,写成app.get('/path',function(req,res){})
的样式,不过经过本人测试 在express 4.x中依然可用。如果采用express 3.x的编写方式,那么routes/index.js可以写成这样:1module.exports = function (app) {2app.get('/', function(req, res) {3res.render('index', { title: 'Express' });4});5}Copied!对应在app.js中,需要将app.use('/',routes);
替换成routes(app);
。两种写作手法而已,看个人喜好。
/about
的路径。那么就可以在index.js
中再追加一条:app.use('/',routes);
,其实其中的/
仅仅是定义路由的路径前缀而已,从这种意义上来讲,routes/index.js
和 routes/user.js
的代码是可以合并的。我们删除user.js
文件,然后在index.js中追加一段代码:app.use('/users', users);
了。其实如果看完上述关于路由器的介绍,熟悉express 3的用户会发现,除了语法和3.x不一样以外,功能上没啥不同。不过事实并非如此,index.js
中的router对象还可以直接用来定义middleware,我们在 index.js
开头再添加一段代码:index.js
内部定义的地址起作用,对于这个路由器文件外的代码是不起作用的,这个设计就比较灵活了。之前咱们在 app.js
中通过 app.use
来定义middleware,那么理论上所有的请求都要经过这种middleware进行处理的,除非在经过这个middleware之前,已经有其他的middleware把HTTP请求处理完成了。
最后看错误捕获这一块了,app.js
中对于代码捕获区分了两种情况,如果当前是开发环境就在出错的时候打印堆栈,否则只显示错误名称。我们现在修改一下 /user
的路由代码:app.get('env') === 'development'
这个条件中去了。app.get('env')
其实是读取的环境变量 NODE_ENV
,这是一个express专用的环境变量,express官方推荐在生产环境将其设置为 production
(参考这里)后会带来三倍的性能提升。官方推荐使用 systemd
或者 Upstart
来设置环境变量,不过如果你的程序不是开机自启动的话,直接配置 .bash_profile
文件即可,也就是说直接在该文件中添加 export NODE_ENV=production
。render
函数,这个函数就是express中用于加载模板的函数。通过代码也可以大体看出,第一个参数是模板的名字,它所代表的文件位于视图文件夹views
目录下的index.ejs
(ejs
文件后缀是ejs
模板引擎的默认后缀);而第二个参数即为传递给这个模板的参数。 接着看一下在模板中,是怎样使用刚才传递的那个titile
参数的,打开views
文件夹下的index.ejs
:controllers
目录,在里面创建user_controller.js文件:web编程中广泛使用MVC(模型Model、视图View、控制器Controller,这三个单词的缩写)的设计模式,在项目创建controllers
正是为了符合这一模式,同时你还需要创建一个models文件夹,专门负责处理数据。具体的使用流程是这样的:controllers
里面放置请求处理的代码,即接收请求参数,对其进行有效性校验,然后调用models
里面的代码进行数据操作(比如说数据库的增删改查等操作),拿到处理结果后加载视图进行渲染。关于MVC的介绍,可以参见维基百科。