@XiangZhou
2015-10-31T12:06:51.000000Z
字数 3141
阅读 4579
nodejs express
前面对nodejs做了一些了解,这次我们来学习基于nodejs的非常流行的web框架express。
1. 第一步先安装express-generator
express-generator可以安装express框架的工程模板生成一个项目。
sudo npm install express-generator -g
-g将这个模块安装到全局模块。
2. 新建一个app
使用express新建一个工程名为myapp的express项目。
express myapp
create : myappcreate : myapp/package.jsoncreate : myapp/app.jscreate : myapp/publiccreate : myapp/public/javascriptscreate : myapp/public/imagescreate : myapp/public/stylesheetscreate : myapp/public/stylesheets/style.csscreate : myapp/routescreate : myapp/routes/index.jscreate : myapp/routes/users.jscreate : myapp/viewscreate : myapp/views/index.jadecreate : myapp/views/layout.jadecreate : myapp/views/error.jadecreate : myapp/bincreate : myapp/bin/www
其会为我们生产一个文件。app.js是app入口文件,public文件夹下放置static文件,views为模板目录,routes为路由规则目录。
3. 安装依赖
express依赖与其他的模块,生产express功能目录的时候,只是将这些依赖写到了package.json文件中,我们还需要安装这些模块。
在myapp目录下,执行下面命令
npm install
可以会报:npm ERR! Please try running this command again as root/Administrator.
这是使用sudo npm install
输入如下的安装log
jade@1.11.0 node_modules/jade├── character-parser@1.2.1├── void-elements@2.0.1├── commander@2.6.0├── mkdirp@0.5.1 (minimist@0.0.8)├── jstransformer@0.0.2 (is-promise@2.1.0, promise@6.1.0)├── with@4.0.3 (acorn@1.2.2, acorn-globals@1.0.6)├── constantinople@3.0.2 (acorn@2.5.2)├── uglify-js@2.5.0 (uglify-to-browserify@1.0.2, async@0.2.10, source-map@0.5.3, yargs@3.5.4)├── transformers@2.1.0 (promise@2.0.0, css@1.0.8, uglify-js@2.2.5)└── clean-css@3.4.6 (commander@2.8.1, source-map@0.4.4)
DEBUG=myapp:* npm start
DEBUG指定了debug模式运行,而且level是all,即什么log都输出。
这是我们访问http://localhost:3000,就会看到express的默认页面。
express处理流程
学过设计模式的都应该知道责任链模式,就是在一个处理流程中,一个请求被顺序处理,在express每个责任人就是express文档中所说的中间件,文档http://www.expressjs.com.cn/,这个我就不细说了。
我没做过web开发,所以对模板的具体使用方式不知道,但是在c++中,模板可以用类型来填充,我们小看了模板那张,web模板就是将数据拉出来,用一个标识替代,然后在rrender模板时,指定标识的值,然后输入为html给用户,这里我们就不深究这个。我们这个只是一个入门的教程。在web开发,资源是由url指定,而怎么怎么组织url,那就是通过url路由来管理。express通过可挂在的路由句柄来实现各个路由的管理,同时也达到了通过路由来对源码组织进行管理。
添加自己的业务到myapp
我们添加一个查看文章的功能。我们添加一个article的路由句柄。在routes目录下面新建一个article.js文件,来具体实现我们的业务罗辑。url为http://localhost:3000/article/id/xxxx,我们每个文章有一个id,一串数字,然后我们返回json数据。
article.js文件内容如下:
var express = require('express');var router = express.Router();var db = require('mongoskin').db('mongodb://localhost:27017/express_demo', {native_parser:true});/* GET users listing. */router.get('/', function(req, res, next) {res.send('respond with a article');});router.get(/^\/id\/(\d+)$/, function(req, res, next) {var article_id = req.params[0];db.collection('article').findOne({id: parseInt(article_id)}, function(err, result) {if (err) {next(err);}res.send(result);});});module.exports = router;
我连接上我本地的mongodb数据库中的express_demo数据库,当我们输入http://localhost:27017/article/id/1,就会调用
router.get(/^\/id\/(\d+)$/, function(req, res, next) {var article_id = req.params[0];db.collection('article').findOne({id: parseInt(article_id)}, function(err, result) {if (err) {next(err);}res.send(result);});});
来处理,我们使用了正则来匹配url,我们使用()来提取出我们的id参数。我在express_demo数据库中的article文档中加了两条数据,格式
{"id":xx,"title":"xxx","content":"xxx"}
我们的id是唯一,所以我们使用了findOne,传入{id:xx}为参数,article_id是一个string,需要parseInt转换成int,不然我们传入的就是{id:'xxx'},和我们的scheme是不匹配的。我们已经完成了我们的路由句柄,我们将它挂在在我们的路由路径上。
var article = require('./routes/article.js');app.use('/article', article);
在app.js中添加上这两句就行了。
结果如下图: