Node.js学习笔记——Node.js开发Web后台服务

一、简介

Node.js 是一个按照谷歌(Google) Chrome V8 引擎的 JavaScript 运行条件。Node.js
使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又急迅。Node.js
的包管理器 npm,是海内外最大的开源库生态系统。

NoSQL 1

能有利于地搭建响应速度快、易于增添的网络采纳,Node.js 使用事件驱动,
非阻塞I/O
模型而可以轻量和高速,分外适合在分布式设备上运行的数码密集型的实时应用。

官网:https://nodejs.org/en/
中文:https://cnodejs.org/http://nodejs.cn/

API:http://nodeapi.ucdok.com/#/api/

简短说Node.js就是运行在劳动器端的JavaScript,是前天流行的言语中能同时运行在前者与后台的程序语言,你可以把JavaScript想像成Java与C#。相关技能:

数据库:MongoDB,非关系型数据库,NoSQL(Not only SQL)

MVC框架:AngularJS

Web服务器:Express

模板引擎:jade、ejs、htmljs、swig、hogan.js

二、搭建Node.js开发环境

2.1、安装Node.js

去官网下下载最新版本的Node.js一步一步按提醒安装即可,如果设置失败就手动安装,将Node.js的安装地方布署到环境变量的path中。

NoSQL 2

设置到位后启动命令行,测试:

NoSQL 3

2.2、安装IDE开发Node.js插件

即使不应用IDE开发品种功用较低,在不少主流的融会开发环境(IDE)中都可以设置插件接济Node.js开发,如Eclipse,那里我们以HBuilder为例:

启动HBuilder->工具->插件安装

NoSQL 4

设置成功后就可以新建Node.js项目了:

NoSQL 5

此间接纳Hello World,新建好的序列如下:

NoSQL 6

hello-world-server.js文件就是一个简短的web服务器,右键选拔“运行格局”->”Node
Application”

控制台提醒“Server running at
http://127.0.0.1:1337/”在浏览器查看的效果如下:

NoSQL 7

三、第一个Node.js程序

在上边的言传身教中,我们是透过IDE已毕编译与运作的,其实手动运行也足以,比如编写一段代码如下:

server.js

//依赖一个http模块,相当于java中的import,与C#中的using
var http = require('http');

//创建一个服务器对象
server = http.createServer(function (req, res) {
//设置请求成功时响应头部的MIME为纯文本
res.writeHeader(200, {"Content-Type": "text/plain"});
//向客户端输出字符
res.end("Hello World\n");
});
//让服务器监听本地8000端口开始运行
server.listen(8000,'127.0.0.1');
console.log("server is runing at 127.0.0.1:8000");

在node环境下解释运作:

NoSQL 8

运行结果:

NoSQL 9

引入 required 模块:大家可以动用 require 指令来载入 Node.js 模块。
开创服务器:服务器可以监听客户端的请求,类似于汤姆Cat、IIS、Apache
、Nginx 等 HTTP 服务器。
接到请求与响应请求 服务器很简单成立,客户端能够使用浏览器或极端发送 HTTP
请求,服务器收到请求后回到响应数据。

首先行请求(require)Node.js 自带的 http 模块,并且把它赋值给 http
变量。
接下去大家调用 http 模块提供的函数: createServer 。这几个函数会回到
一个目的,这么些目标有一个号称 listen 的方式,这么些主意有一个数值参数,
指定这一个 HTTP 服务器监听的端口号。

四、NPM(Node.js包管理器)

NPM是及其NodeJS一起安装的包管理工具,能解决NodeJS代码安插上的无数标题,常见的运用处境有以下三种:
a)、允许用户从NPM服务器下载外人编写的第三方包到地点使用。
b)、允许用户从NPM服务器下载并设置别人编写的通令行程序到当地使用。
c)、允许用户将团结编排的包或指令行程序上传出NPM服务器供别人使用。

官网:https://www.npmjs.com/

4.1、查看npm版本
出于新版的nodejs已经集成了npm,所之前面npm也一并安装好了。同样可以经过输入
“npm -v” 来测试是还是不是成功安装。命令如下,出现版本提醒表示安装成功:

NoSQL 10

4.2、升级npm

即使你安装的是旧版本的 npm,可以很简单得经过 npm 命令来进步

npm install npm -g

 NoSQL 11

4.3、安装模块

npm install <Module Name> -参数

比方带参数-g表示全局安装,否则只是安装到某个目录下。

以下实例,大家采纳 npm 命令安装常用的 Node.js web框架模块 express

NoSQL 12

4.4、卸载模块

咱俩得以接纳以下命令来卸载 Node.js 模块。
npm uninstall <Module Name>

如先使用安装指令安装bootstrap:

npm install bootstrap

再接纳卸载指令删除模块:

npm uninstall bootstrap

可以到 /node_modules/ 目录下查看包是不是还留存

4.5、模块列表

行使模块列表命令能够一本万利的看看眼前项目中凭借的包:
NoSQL,npm ls

NoSQL 13

4.6、更新模块

俺们可以利用以下命令更新模块:
npm update 模块名称
npm up -g 模块名称

4.7、搜索模块

npm search 模块名称

 

4.8、NPM 常用命令
除去本章介绍的一部万分,NPM还提供了多如牛毛作用,package.json里也有诸多别样有效的字段。
除却可以在npmjs.org/doc/查看官方文档外,那里再介绍部分NPM常用命令。
NPM提供了广大限令,例如install和publish,使用npm help可查阅所有命令。
NPM提供了累累指令,例如install和publish,使用npm help可查看所有命令。
运用npm help <command>可查阅某条命令的详尽匡助,例如npm help
install。
在package.json所在目录下使用npm install .
-g可先在本土安装当前命令行程序,可用以发表前的当地测试。
运用npm update
<package>可以把当前目录下node_modules子目录里边的相应模块更新至最新版本。
利用npm update <package>
-g能够把全局安装的附和命令行程序更新至最新版。
动用npm cache
clear可以清空NPM本地缓存,用于对付使用相同版本号发表新本子代码的人。
利用npm unpublish
<package>@<version>可以撤销揭橥温馨揭橥过的某部版本代码。

4.9、更换NPM 镜像

因为npm的服务器在国外,在网络状态不好的动静下引入一个模块会因为网络延迟而败诉,可以转移成国内速度更快的镜像服务器,那里以使用TmallNPM 镜像(http://npm.taobao.org/)为例:

npm install -g cnpm –registry=https://registry.npm.taobao.org

NoSQL 14

这样就可以动用 cnpm 命令来设置模块了:
$ cnpm install [name]

NoSQL 15

那是一个完好无缺 npmjs.org
镜像,你可以用此代替官方版本(只读),同步频率近日为 10分钟五遍以有限支撑尽量与法定服务联合。

五、Express

Express 是一个简练而灵活的 node.js Web应用框架,
提供了一名目繁多有力特性帮忙您成立各类 Web 应用,和添加的 HTTP 工具。
选择 Express
可以很快地搭建一个完完全全意义的网站。使用Node.js作为AngularJS开发Web服务器的特等办法是使用Express模块。

Express官网: http://expressjs.com/

Express4.x API:http://expressjs.com/zh-cn/4x/api.html

NoSQL 16

5.2、Express框架要旨特性

可以安装中间件来响应 HTTP 请求。

概念了路由表用于执行不一的 HTTP 请求动作。

可以通过向模板传递参数来动态渲染 HTML 页面。

累加的 HTTP 火速方法和无限制排列组合的 Connect
中间件,让你创立健康、友好的 API 变得既敏捷又不难。

Express 不对 Node.js 已部分特性开展二次抽象,大家只是在它之上伸张了 Web
应用所需的基本成效。

5.3、安装 Express

设置 Express 并将其保存到依靠列表中:

npm install express –save

NoSQL 17

如上命令全局安装express。也可设置时指定安装中间件。

body-parser – node.js 中间件,用于拍卖 JSON, Raw, Text 和 URL
编码的数额。
cookie-parser –
那就是一个解析Cookie的工具。通过req.cookies能够取到传过来的cookie,并把它们转成对象。
multer – node.js 中间件,用于拍卖
enctype=”multipart/form-data”(设置表单的MIME编码)的表单数据。

$ npm install body-parser –save
$ npm install cookie-parser –save
$ npm install multer –save

默许那些模块都早已添加。

5.4、第二个Express框架实例

接下去大家采用 Express 框架来输出 “Hello World”。
以下实例中大家引入了 express 模块,并在客户端发起呼吁后,响应 “Hello
World” 字符串。

成立一个目录,如Project,进入命令行:

使用npm install express 导入express模块。

在目录下创制hello.js文件,如下所示:

//引入express模块
var express = require('express');
//创建一个app对象,类似一个web 应用(网站)
var app = express();
//接受指定路径的请求,指定回调函数
app.get('/', function (req, res){
res.send('Hello World');
});
//创建一个web服务器,可以认为就是web服务器对象
//监听8081端口,当监听成功时回调
var server = app.listen(8081, function () {
   var host = server.address().address;  //地址
   var port = server.address().port;  //端口
    console.log("应用实例,访问地址为 http://%s:%s", host, port);
});
})

使用node执行js:

NoSQL 18

运行结果:

NoSQL 19

5.5、使用Nodeclipse开发Express项目

设若一贯利用记事本效用会不高,nodeclipse插件可以一本万利的创导一个Express项目,步骤如下:

NoSQL 20

开创好的品类如下:

NoSQL 21

app.js是网站:

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var index = require('./routes/index');
var users = require('./routes/users');

var app = express();

//指定视图引擎为ejs
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', index);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

bin\www是web服务器:

#!/usr/bin/env node

/**
 * 依赖模块,导入
 */

var app = require('../app');
var debug = require('debug')('nodejsexpress:server');
var http = require('http');

/**
 * 从上下文环境中获得监听端口,如果空则3000
 */

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * 创建Web服务器
 */

var server = http.createServer(app);

/**
 * 开始监听
 */

server.listen(port);
server.on('error', onError);  //指定发生错误时的事件
server.on('listening', onListening);  //当监听成功时的回调

/**
 * 规范化端口
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 *错误事件监听
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  //错误处理
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);  //结束程序
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * 当用户访问服务器成功时的回调
 */

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

routers/index.js路由,有点类似控制器或Servlet:

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

/* 获得首页 */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

module.exports = router;

views/index.ejs首页视图:

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
  </body>
</html>

在www上右键拔取“运行方式”->“Node Application”运行结果:

NoSQL 22

NoSQL 23

5.6、ejs基础

ejs是一个Express
Web应用的模版引擎,在NodeJS开发中得以选择的模板引擎可能是颇具Web应用开发中范围最广的,如jade、ejs、htmljs、swig、hogan.js,但ejs是最不难上手的,与jsp,asp,php的原有模板引擎风格很像。

官网:http://www.embeddedjs.com/

加上一个product.js路由:

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

/* 产品 */
router.get('/', function(req, res, next) {

  var products=[];
  products.push({name:"ZTE U880",price:899.8});
  products.push({name:"HuWei 荣耀8",price:1899.8});
  products.push({name:"iPhone 7 Plus 128G",price:5899.8});

  //将product视图与指定的对象渲染后输出到客户端
  res.render('product', { title: '天狗商城', pdts:products});
});

module.exports = router;

在views目录下添加product.ejs视图,那里是一个简便的MVC:

<!DOCTYPE html>
<html>

    <head>
        <title>
            <%= title %>
        </title>
        <link rel='stylesheet' href='/stylesheets/style.css' />
    </head>

    <body>
        <h1><%= title %> - 产品列表</h1>
        <table border="1" width="80%">
            <tr>
                <th>序号</th>
                <th>名称</th>
                <th>价格</th>
            </tr>
            <%pdts.forEach(function(pdt,index){%>
            <tr>
                <td>
                    <%=index+1%>
                </td>
                <td>
                    <%=pdt.name%>
                </td>
                <td>
                    <%=pdt.price%>
                </td>
            </tr>
            <%});%>
        </table>

        <ul>
            <% for(var i=0; i<pdts.length; i++) {%>
            <li>
                <%=pdts[i].name%>
            </li>
            <% } %>
    </body>

</html>

修改app,注册定义好的模块product:

var index = require('./routes/index');
var users = require('./routes/users');
var pdts = require('./routes/product');

var app = express();

//指定视图引擎为ejs
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', index);
app.use('/users', users);
app.use('/pdt', pdts);

运转结果:

NoSQL 24

5.7、lodash

那是一个颇具相同接口、模块化、高品质等特点的 JavaScript
工具库。可以卓殊便利的操作json。

官网:http://lodashjs.com/

安装:

npm i -g npm

npm i –save lodash

安装时先用cd切换来眼前项目下。

假定浏览器接纳可以平素引入:

<script src=”lodash.js”></script>

后台Node.js使用,可以引入模块:

//导入lodash模块
var _= require('lodash');

var products=[];
products.push({name:"ZTE U880",price:899.8});
products.push({name:"HuWei 荣耀8",price:1899.8});
products.push({name:"iPhone 7 Plus 128G",price:5899.8});

//1、取出第一个元素
var obj1=_.first(products);
console.log(obj1.name);  //ZTE U880

//2、取出最后一个元素
var obj2=_.last(products);
console.log(obj2.name);  //iPhone 7 Plus 128G

//3、指定查找条件返回符合条件的索引
var obj3=_.findIndex(products,function(obj){
    return obj.price>=1000&&obj.name.indexOf("7")>0;
});
console.log(obj3);  //2

//4、指定查找条件返回查找到的对象
var obj4=_.find(products,function(obj){
    return obj.price>=1000&&obj.name.indexOf("7")>0;
});
console.log(obj4);  //{ name: 'iPhone 7 Plus 128G', price: 5899.8 }

//5、排序
var obj5=_.orderBy(products,["price","name"],["desc","asc"]);
console.log(obj5); 

//[ { name: 'iPhone 7 Plus 128G', price: 5899.8 },
//{ name: 'HuWei 荣耀8', price: 1899.8 },
//{ name: 'ZTE U880', price: 899.8 } ]

//6、查找价格为1899.8的产品的key
var obj6=_.findKey(products,{price:1899.8});
console.log(obj6);   //1

API的使用卓殊简单,但须求注意版本,可以现查现用,API地址:https://lodash.com/docs/4.17.2 

5.8、参数

5.8.1、URL中的参数占位

Checks route params (req.params), ex: /user/:id

127.0.0.1:3000/index,那种气象下,我们为了博取index,大家可以通过使用req.params获得,通过那种办法大家就足以很好的处理Node中的路由处理难点,同时选拔那一点可以极度便利的落到实处MVC情势;

//获得产品根据Id
router.get('/:id/:category',function(request,res,next){
    res.send(request.params.id+","+request.params.category);
});

运转结果:

NoSQL 25

5.8.2、URL中的QueryString

Checks query string params (req.query), ex: ?id=12

127.0.0.1:3000/index?id=12,那种意况下,那种方法是得到客户端get情势传递过来的值,通过拔取req.query.id就足以博得,类似于PHP的get方法;

router.get('/:id',function(request,res,next){
    res.send("name:"+request.query.name);
});

运转结果:

NoSQL 26

5.8.3、HTTP正文中的参数

 在post请求中得到表单中的数据。

Checks urlencoded body params (req.body), ex: id=

127.0.0.1:300/index,然后post了一个id=2的值,那种办法是得到客户端post过来的数量,可以透过req.body.id获取,类似于PHP的post方法;

NoSQL 27

页面:

NoSQL 28NoSQL 29

<!DOCTYPE html>
<html>

    <head>
        <title>
            <%= title %>
        </title>
        <link rel='stylesheet' href='/stylesheets/style.css' />
    </head>

    <body>
        <h1><%= title %> - 产品列表</h1>
        <table border="1" width="80%">
            <tr>
                <th>序号</th>
                <th>名称</th>
                <th>价格</th>
            </tr>
            <%pdts.forEach(function(pdt,index){%>
            <tr>
                <td>
                    <%=index+1%>
                </td>
                <td>
                    <%=pdt.name%>
                </td>
                <td>
                    <%=pdt.price%>
                </td>
            </tr>
            <%});%>
        </table>

        <ul>
            <% for(var i=0; i<pdts.length; i++) {%>
            <li>
                <%=pdts[i].name%>
            </li>
            <% } %>
        </ul>
<p>
            <%if(typeof msg!="undefined"){%>
                <%=msg%>
            <%}%>
</p>
        <form action="pdt/add" method="post">
            <p>
                名称:<input name="name" />
            </p>
            <p>
                价格:<input name="price" />
            </p>
            <button>添加</button>
        </form>




    </body>

</html>

View Code

代码:

router.post('/add',function(request,res,next){
    var entity={name:request.body.name,price:request.body.price};
    products.push(entity);
      //将product视图与指定的对象渲染后输出到客户端
      res.render('product', { title: '天狗商城', pdts:products,msg:"添加成功"});
});

结果:

NoSQL 30

5.9、JSON

万一急需Node.js向外提供再次回到JSON的接口,Express也是不行有利于的,可以运用原来在浏览器中行使到的JSON对象,那是一个浏览器内置对象在服务可以向来动用:

将目的种类化成字符:

            //对象
            var rose={"name":"Rose","weight":"65"};
            //序列化成字符串
            var str=JSON.stringify(rose);
            alert(str);

结果:

NoSQL 31

反种类化,将字符转换成对象:

            //将字符串转换成JavaScript对象
            var markStr='{"name":"mark","weight":"188"}';
            var mark=JSON.parse(markStr);
            alert(mark.name+","+mark.weight);

结果:

NoSQL 32

Express已经封装了一个json方法,直接调用该措施就可以体系化对象:

/* 产品 */
router.get('/rest', function(req, res, next) {
  res.json(products);
});

运作结果:

 NoSQL 33

演习:达成一个书本管理的效应,图书包含(编号,名称,小编,图片,价格),完成:

a)、非AJAX的CRUD,使用Node.js+Express+ejs的动态技术。

b)、AJAX的CRUD,使用Node.js+Express+jQuery+HTML技术已毕。

c)、使用RestFul风格的劳务到位第个作业,get,post,delete,put请。

六、RESTful(表述性状态转移)

REST是英文Representational State
Transfer的缩写,粤语称之为“表述性状态转移”
基于HTTP协议
是另一种服务架构
传递是JSON、POX(Plain Old XML)而不是SOAP格式的数据
丰硕利用HTTP谓词(Verb)
爱慕数据的传导,业务逻辑交给客户端自行处理

REST是一种分布式服务架构的品格约束,像Java、.Net(WCF、WebAPI)都有对该约束的完结,使URL变得更加有意义,尤其从简,如:

http://www.zhangguo.com/products/1 get请求 表示收获所有产品的第1个

http://www.zhangguo.com/products/product post请求 表示添加一个出品

http://www.zhangguo.com/products/1/price get请求 表示收获第1个产品的价格

http://www.zhangguo.com/products/1 delete请求 删除编号为1的成品

REST设计须求按照的规格
互联网上的具备东西都被架空为资源(resource);
每个资源对应一个唯一的资源标识符(resource identifier);
通过通用的连接器接口(generic connector interface)对资源开展操作;
对资源的各样操作不会改变资源标识符;
装有的操作都是无状态的(stateless)

谓词
GET
代表查询操作,相当于Retrieve、Select操作
POST
代表插入操作,相当于Create,Insert操作
PUT
表示修改操作,相当于Update操作
DELETE
意味着删除操作,相当于Delete操作

其余还有:

NoSQL 34

NodeJS+Express可以很不难的贯彻REST

application/x-www-form-urlencoded

multipart/form-data

application/json

res.setHeader(‘Content-Type’, ‘application/json;charset=utf-8’);  

以身作则代码cars.js:

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

var cars=[];
cars.push({id:201701,name:"BMW",price:190,speed:"210km/h",color:"白色"});
cars.push({id:201702,name:"BYD",price:25,speed:"160km/h",color:"红色"});
cars.push({id:201703,name:"Benz",price:300,speed:"215km/h",color:"蓝色"});
cars.push({id:201704,name:"Honda",price:190,speed:"170km/h",color:"黑色"});
cars.push({id:201705,name:"QQ",price:130,speed:"210km/h",color:"白色"});

/* Get */
/*获得所有汽车*/
/*url /cars/*/
router.get('/', function(req, res, next) {
    res.json(cars);
});

/*Get*/
/*获得汽车通过id*/
/*url:/cars/:id  */
router.get('/:id', function(req, res, next) {
     //从路径中映射参数,转换成数字
      var id=parseInt(req.params.id);
      var car=_.find(cars,{id:id});
      res.json(car);
});

/*Post*/
/*添加汽车*/
/*url:/cars/car  */
router.post('/car', function(req, res, next) {
      var car=req.body;  //从请求正文中获得json对象
      car.id=_.last(cars).id+1;  //将编号修改为最后一辆车的编号+1
      cars.push(car);  //将汽车对象添加到集合中
      res.json(car);  //将添加成功的车以json的形式返回
});

/*Put*/
/*修改汽车*/
/*url:/cars/car  */
router.put('/car', function(req, res, next) {
      var car=req.body;  //从请求正文中获得json对象
      console.log(req.body);
      var index=_.findIndex(cars,{id:parseInt(car.id)});  //根据id获得车在集合中的下标

      cars[index]=car;  //替换原对象
      //res.json(car);  //将修改后的车以json的形式返回
      res.send({status:"success", message:"更新成功!"});  
});

/*Delete*/
/*删除汽车*/
/*url:/cars/:id  */
router.delete('/id/:id', function(req, res, next) {
      //获得url中的编号参数
      var id=parseInt(req.params.id);
      var index=_.findIndex(cars,{id:id});  //根据id获得车在集合中的下标
      cars.splice(index,1);   //在cars数组中删除下标从index开始的1条数据
      res.send({status:"success", message:"删除成功!"});  
});

module.exports = router;

示范代码app.js:

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var index = require('./routes/index');
var users = require('./routes/users');
var pdts = require('./routes/product');
var task = require('./routes/task');
var cars = require('./routes/cars');

var app = express();

//指定视图引擎为ejs
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', index);
app.use('/users', users);
app.use('/pdt', pdts);
app.use("/task",task);
app.use("/cars",cars);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

/* Get */
/*获取所有汽车*/
/*url /cars/*/

NoSQL 35

/*Get*/
/*取得汽车经过id*/
/*url:/cars/:id */

NoSQL 36

/*Post*/
/*加上汽车*/
/*url:/cars/car */

 NoSQL 37

NoSQL 38

参数中的json格式一定要动用正规格式,注意引号,注意Content-Type,默许的Content-Type类型是:application/x-www-form-urlencoded

/*Put*/
/*修改小车*/
/*url:/cars/car */

NoSQL 39

NoSQL 40

/*Delete*/
/*删去小车*/
/*url:/cars/:id */

NoSQL 41

NoSQL 42

七、示例下载

git:https://coding.net/u/zhangguo5/p/NodeJS001/git

git:https://coding.net/u/zhangguo5/p/NodeJSExpress/git

参照:http://www.cnblogs.com/best

网站地图xml地图