[关闭]
@XiangZhou 2015-10-31T20:06:51.000000Z 字数 3141 阅读 4343

使用express创建自己第一个nodejs程序

nodejs express


前面对nodejs做了一些了解,这次我们来学习基于nodejs的非常流行的web框架express。
1. 第一步先安装express-generator
express-generator可以安装express框架的工程模板生成一个项目。

  1. sudo npm install express-generator -g

-g将这个模块安装到全局模块。
2. 新建一个app
使用express新建一个工程名为myapp的express项目。

  1. express myapp
  1. create : myapp
  2. create : myapp/package.json
  3. create : myapp/app.js
  4. create : myapp/public
  5. create : myapp/public/javascripts
  6. create : myapp/public/images
  7. create : myapp/public/stylesheets
  8. create : myapp/public/stylesheets/style.css
  9. create : myapp/routes
  10. create : myapp/routes/index.js
  11. create : myapp/routes/users.js
  12. create : myapp/views
  13. create : myapp/views/index.jade
  14. create : myapp/views/layout.jade
  15. create : myapp/views/error.jade
  16. create : myapp/bin
  17. create : myapp/bin/www

其会为我们生产一个文件。app.js是app入口文件,public文件夹下放置static文件,views为模板目录,routes为路由规则目录。
3. 安装依赖
express依赖与其他的模块,生产express功能目录的时候,只是将这些依赖写到了package.json文件中,我们还需要安装这些模块。
在myapp目录下,执行下面命令

  1. npm install

可以会报:npm ERR! Please try running this command again as root/Administrator.

这是使用sudo npm install
输入如下的安装log

  1. jade@1.11.0 node_modules/jade
  2. ├── character-parser@1.2.1
  3. ├── void-elements@2.0.1
  4. ├── commander@2.6.0
  5. ├── mkdirp@0.5.1 (minimist@0.0.8)
  6. ├── jstransformer@0.0.2 (is-promise@2.1.0, promise@6.1.0)
  7. ├── with@4.0.3 (acorn@1.2.2, acorn-globals@1.0.6)
  8. ├── constantinople@3.0.2 (acorn@2.5.2)
  9. ├── uglify-js@2.5.0 (uglify-to-browserify@1.0.2, async@0.2.10, source-map@0.5.3, yargs@3.5.4)
  10. ├── transformers@2.1.0 (promise@2.0.0, css@1.0.8, uglify-js@2.2.5)
  11. └── clean-css@3.4.6 (commander@2.8.1, source-map@0.4.4)
  1. 试运行我们的例子
  1. DEBUG=myapp:* npm start

DEBUG指定了debug模式运行,而且level是all,即什么log都输出。
这是我们访问http://localhost:3000,就会看到express的默认页面。

  1. express处理流程
    学过设计模式的都应该知道责任链模式,就是在一个处理流程中,一个请求被顺序处理,在express每个责任人就是express文档中所说的中间件,文档http://www.expressjs.com.cn/,这个我就不细说了。
    我没做过web开发,所以对模板的具体使用方式不知道,但是在c++中,模板可以用类型来填充,我们小看了模板那张,web模板就是将数据拉出来,用一个标识替代,然后在rrender模板时,指定标识的值,然后输入为html给用户,这里我们就不深究这个。我们这个只是一个入门的教程。在web开发,资源是由url指定,而怎么怎么组织url,那就是通过url路由来管理。express通过可挂在的路由句柄来实现各个路由的管理,同时也达到了通过路由来对源码组织进行管理。

  2. 添加自己的业务到myapp
    我们添加一个查看文章的功能。我们添加一个article的路由句柄。在routes目录下面新建一个article.js文件,来具体实现我们的业务罗辑。url为http://localhost:3000/article/id/xxxx,我们每个文章有一个id,一串数字,然后我们返回json数据。
    article.js文件内容如下:

  1. var express = require('express');
  2. var router = express.Router();
  3. var db = require('mongoskin').db('mongodb://localhost:27017/express_demo', {native_parser:true});
  4. /* GET users listing. */
  5. router.get('/', function(req, res, next) {
  6. res.send('respond with a article');
  7. });
  8. router.get(/^\/id\/(\d+)$/, function(req, res, next) {
  9. var article_id = req.params[0];
  10. db.collection('article').findOne({id: parseInt(article_id)}, function(err, result) {
  11. if (err) {
  12. next(err);
  13. }
  14. res.send(result);
  15. });
  16. });
  17. module.exports = router;

我连接上我本地的mongodb数据库中的express_demo数据库,当我们输入http://localhost:27017/article/id/1,就会调用

  1. router.get(/^\/id\/(\d+)$/, function(req, res, next) {
  2. var article_id = req.params[0];
  3. db.collection('article').findOne({id: parseInt(article_id)}, function(err, result) {
  4. if (err) {
  5. next(err);
  6. }
  7. res.send(result);
  8. });
  9. });

来处理,我们使用了正则来匹配url,我们使用()来提取出我们的id参数。我在express_demo数据库中的article文档中加了两条数据,格式

  1. {
  2. "id":xx,
  3. "title":"xxx",
  4. "content":"xxx"
  5. }

我们的id是唯一,所以我们使用了findOne,传入{id:xx}为参数,article_id是一个string,需要parseInt转换成int,不然我们传入的就是{id:'xxx'},和我们的scheme是不匹配的。我们已经完成了我们的路由句柄,我们将它挂在在我们的路由路径上。

  1. var article = require('./routes/article.js');
  2. app.use('/article', article);

在app.js中添加上这两句就行了。

结果如下图:
此处输入图片的描述

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注