@XiangZhou
2015-10-31T20:06:51.000000Z
字数 3141
阅读 4343
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 : myapp
create : myapp/package.json
create : myapp/app.js
create : myapp/public
create : myapp/public/javascripts
create : myapp/public/images
create : myapp/public/stylesheets
create : myapp/public/stylesheets/style.css
create : myapp/routes
create : myapp/routes/index.js
create : myapp/routes/users.js
create : myapp/views
create : myapp/views/index.jade
create : myapp/views/layout.jade
create : myapp/views/error.jade
create : myapp/bin
create : 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中添加上这两句就行了。
结果如下图: