元宵还没到,先向所有朋友拜一个晚年~~~

文章目录:

1、组件版本号

-- --node

-- --express

-- --Mongoose

2、初始化项目 firstblood

-- --用 express 自动初始化(推荐)

-- --附:手动初始化 package.json

3、关于 express 的 app.js

4、前端模板 Handlebars Ejs Jade

-- --以 Ejs 模板为例

-- --体验一把: route 路由是如何工作的

5、CSS、JS框架支持

-- --bootstrap2.3.2 + jquery 1.11.1 为例

-- --头部尾部重用

6、增删改查少不了

-- --mongodb 小回顾

-- --node 操作 Mongoose 【挑战:一个后台登陆验证+展示mongodb中现有会员信息的小案例】

-- --增强案例:支持登陆并新增修改会员信息的系统,还得支持 session ~

1、组件版本号:

1.1、node: 资料大全
$ node -v
v0.10.35
1.2、express: 3x api
$ express -V
3.0.0
1.3、Mongoose : 3.8.24 api
$ npm info mongoose version
3.8.24 //$ npm install mongoose
//注:在Windows下安装 **报错(兼容性错误)** 没事的!
//如果你有强迫症 请安装 Microsoft Visual Studio 2010 即可
//向坚持在 windows 平台的同学致敬……(唉,我的 mac 本本也只是看看电影,没事!)
mongoose@3.8.24 node_modules\mongoose
├── regexp-clone@0.0.1
├── sliced@0.0.5
├── muri@0.3.1
├── hooks@0.2.1
├── mpath@0.1.1
├── mpromise@0.4.3
├── ms@0.1.0
├── mquery@0.8.0 (debug@0.7.4)
└── mongodb@1.4.31 (readable-stream@1.0.33, kerberos@0.0.9, 9, bson@0.2.19)

再次重申: 在 Windows 下安装Mongoose 报错(兼容性错误) 没事的! 没事的!!!

如果你有强迫症 请安装 Microsoft Visual Studio 2010 即可 ( Win7 64bit 推荐 )

2、初始化项目 firstblood

2.1、用 express 自动初始化(推荐)

1、先全局安装 express:(来自于淘宝国内镜像)

以 3.2.2 为例:

$ npm install -g express@3.2.2 --registry=https://registry.npm.taobao.org

tips:

关于 4.0 呢,中间件全被独立出来,网上 download 下来的代码大都是3.x,可能会出错……

建议用3.x。教程也多,一搜一大堆容易解决不常见的坑。

2、创建项目:

快速熟悉下 express 的指令:

Usage: express [options]

Options:

  -h, --help          输出帮助信息
-V, --version 输出版本号
-e, --ejs 添加 ejs 模板引擎支持 (默认为jade)
-H, --hogan 添加 hogan.js模板引擎支持
-c, --css 样式 <引擎> 支持 (less|stylus) (默认为css)
-f, --force 强制在非空目录执行

开始安装:

//-e 即支持 ejs; 你喜欢 **ejs** 还是 **jade** ?
$ express firstblood -e express firstblood -e create : firstblood
create : firstblood/package.json
create : firstblood/app.js
create : firstblood/public
create : firstblood/routes
create : firstblood/routes/index.js
create : firstblood/routes/user.js
create : firstblood/views
create : firstblood/views/index.ejs
create : firstblood/public/javascripts
create : firstblood/public/images
create : firstblood/public/stylesheets
create : firstblood/public/stylesheets/style.css install dependencies:
$ cd firstblood && npm install run the app:
$ node app //安装组件
$ cd firstblood && npm install ejs@2.3.1 node_modules\ejs express@3.2.2 node_modules\express
├── methods@0.0.1
├── fresh@0.1.0
├── cookie-signature@1.0.1
├── range-parser@0.0.4
├── qs@0.6.3
├── buffer-crc32@0.2.1
├── cookie@0.0.5
├── commander@0.6.1
├── mkdirp@0.3.4
├── debug@2.1.1 (ms@0.6.2)
├── send@0.1.0 (mime@1.2.6)
└── connect@2.7.8 (pause@0.0.1, bytes@0.2.0, formidable@1.0.1

这时候 可以启动 node app.js 项目,可以浏览 http://localhost:3000/

按 Ctrl + c结束;

tips:

每次代码改动都需要重启 node! 不过安装 npm install supervisor 后可以偷懒;它会在你每次修改完代码后自动重启。 神器哦!

3、安装 mongoose

package.json 文件自动更新 dependencies 字段:

npm install mongoose --save
2.2、附:手动初始化 package.json
$ mkdir firstblood && cd firstblood
$ npm init

依次填写: name、version、description、entry point(入口index.js或app.js)、test command(启动指令 node index.js)、git repository(git库)、keywords、author、license(ISC)…… 大胆随便填写,最后 输入 yes 生成 package.json 文件。

接下来安装 mongoose,express,修改 package.json

"dependencies": {
"mongoose": "^3.8.24",
"express": "3.x"
},

然后在 当前目录下执行 npm install 安装组件

3、关于 express的 app.js

小解释:

/**
* Module dependencies. 依赖的模块(处理路由,业务逻辑)
*/
var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, http = require('http')
, path = require('path'); //实例化 express 并赋值app变量
var app = express(); // all environments 依赖的环境(配置参数)
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev')); //bodyParser 改成 urlencoded 可以忽略一些 Node窗口里的警告
app.use(express.urlencoded());
//app.use(express.bodyParser()); app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public'))); // development only 开发模式(检查错误)
if ('development' == app.get('env')) {
app.use(express.errorHandler());
} // 路由解析
app.get('/', routes.index);
app.get('/users', user.list); // 创建一个http server 启动端口
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});

4、前端模板 Handlebars Ejs Jade

关于这个话题移步:

Jade、EJS、Handlebars 万行代码解释效率比较

Jade和ejs,哪一个更胜一筹

John大神写的20行模板

楼主总结: 项目个人秀当然是 jade、商业化的肯定是 Ejs、Handlebars; 楼主喜欢后者……

4.1、以 Ejs 模板为例

让ejs模板文件 支持 html 格式:

a:修改app.js

//让Ejs支持 html
app.engine('.html', ejs.__express);
app.set('view engine', 'html');
//app.set('view engine', 'ejs');

b:引入 ejs 模块

//手动添加 ejs 以便支持 .html
ejs = require('ejs');

c:修改 /views 目录下的入口文件后缀为 index.html

重启app即可

4.2、体验一把: route 路由是如何工作的

1、在app.js文件中 找到 路由解析部分;添加

app.get('/lu-you-qing-qiu', routes.luyou);

它负责处理你的请求 "/lu-you-qing-qiu"

2、找到: /routes/index.js 文件;添加

exports.luyou = function(req, res){
res.render('lu-you-ye-mian', { title: '“路由”是长这样的!' });
};

找一个名为 "lu-you-ye-mian.html" (注:上面已经把ejs改成html了哦)去渲染

关于模块化写法,请移步这里: NodeJS 菜鸟入门

3、渲染页面;在 /views/ 目录增加 lu-you-ye-mian.html :

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

愉快的启动app.js吧!

5、CSS、JS框架支持

5.1、以 bootstrap2.3.2 + jquery 1.11.1 为例:

1、将 bootstrap 文件夹中的 /css/目录下的所有文件 复制到 /public/stylesheets/

2、将 /js/目录下的所有文件加上再下载一个 jquery 复制到 /public/javascripts/

3、将 /img/ 目录下所有文件复制到 /public/images/

5.2、头部尾部重用

新建 header.html :

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title><%= title %></title>
<!-- Bootstrap -->
<link href="/stylesheets/bootstrap.min.css" rel="stylesheet" media="screen">
<!-- <link href="css/bootstrap-responsive.min.css" rel="stylesheet" media="screen"> -->
</head>
<body screen_capture_injected="true">

新建 footer.html :

<script src="/javascripts/jquery-1.11.1.min.js"></script>
<script src="/javascripts/bootstrap.min.js"></script>
</body>
</html>

那么 index.html 可以改成这样:

<% include header.html %>

    <h1><%= title %></h1>
<p>Welcome to <%= title %></p> <% include footer.html %>

6、增删改查少不了

mongodb 安装、启动、常见指令……移步这里 Mongodb For Windows

6.1、mongodb 小回顾

接下来为 firstblood 项目创建一点数据 (mongodb 版本号:2.6.6)

> use firstblood
switched to db firstblood
> var listArr = [];for(i=0;i<5;i++){listArr.push({"user":"test"+i,"password":"sa
"+i,"age":i})}
5
> db.admins.insert(listArr)
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 5,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
> db.admins.find()
{ "_id" : ObjectId("54f3f267c0d71446ee04a7f6"), "user" : "test0", "password" : "
sa0", "age" : 0 }
{ "_id" : ObjectId("54f3f267c0d71446ee04a7f7"), "user" : "test1", "password" : "
sa1", "age" : 1 }
{ "_id" : ObjectId("54f3f267c0d71446ee04a7f8"), "user" : "test2", "password" : "
sa2", "age" : 2 }
{ "_id" : ObjectId("54f3f267c0d71446ee04a7f9"), "user" : "test3", "password" : "
sa3", "age" : 3 }
{ "_id" : ObjectId("54f3f267c0d71446ee04a7fa"), "user" : "test4", "password" : "
sa4", "age" : 4 }
>_

OK 成功了,暂且多多回顾下其他指令吧

6.2、node 操作 Mongoose 【挑战:一个后台登陆验证+展示mongodb中现有会员信息的小案例】

1、新建目录: mkdir db;添加数据集合的结构 firstblood_schema.js

// 链接 firstblood 集合
var mongoose = require('mongoose');
var db = mongoose.createConnection('mongodb://127.0.0.1:27017/firstblood');
// 链接错误
db.on('error', function(error) {
    console.log(error);
});
// Schema 结构
var Schema = mongoose.Schema;
var userlistScheMa = new Schema({
user : {type : String},
password : {type : String},
//content : {type : String},
//time : {type : Date, default: Date.now},
age : {type : Number}
}); // 关联 firstblood -> admins 表
exports.userlist = db.model('admins', userlistScheMa);
exports.db = db;

关于 Schema 、Model 、Entity 以及 Mongoose 其他APi参考,可以移步这里:

Mongoose学习参考文档

2、在 /routes/ 目录,修改 index.js (当然也可以新建一个文件)

/*
* GET home page.
*/
var firstblood = require('./../db/firstblood_schema.js');
/**/
exports.index = function (req, res){
res.render('index', {
title: 'Express',
});
}
exports.luyou = function(req, res){
res.render('lu-you-ye-mian', { title: '“路由”是长这样的!' });
}
exports.login = function (req, res){
res.render('login', {
title: 'login'
});
}
/* home */
exports.home = function(req, res) {
var query = {user: req.body.user, password: req.body.password};
firstblood.userlist.count(query, function(err, doc){
if (doc==1) {
var findResult = firstblood.userlist.find(function(error, result){
if (error) {
res.send(error);
}else{
res.render('home', {
title : '后台',
status: doc,
username : query.user,
adminlist : result,
date : new Date()
}); }
});
}else{
res.render('home', {
title : '后台',
status: doc,
});
//res.redirect('/');
}
});
}

4、在 app.js 中添加模块依赖(如果新建路由模块的话)和路由:

// 路由解析
// firstblood 项目路由
app.get('/login',routes.login);//增加
app.post('/home',routes.home);//提交

5、在 /views/ 目录,添加 login.html

<% include header.html %>
<div class="container-fluid">
<div class="row-fluid">
<form class="span12" action="home" method="post">
<fieldset>
<legend>请输入</legend>
<p>
<span>用户名:</span>
<br>
<input id="user" name="user" type="text">
</p>
<p>
<span>密码:</span>
<br>
<input id="password" name="password" type="password">
</p>
<p><input type="submit" value="登陆" class="btn btn-danger"></p>
</fieldset>
</form>
</div>
</div>
<% include footer.html %>

再添加 home.html

<% include header.html %>
<div class="container-fluid">
<div class="row-fluid">
<h1>后台管理</h1>
<% if (status) { %>
<p class="lead">欢迎您: <%=username%></p>
<p class="label label-info">登陆时间: <%=date%></p>
<h3>管理员列表</h3>
<% if (adminlist.length) { %>
<table class="table table-hover span12">
<thead>
<tr>
<th>#</th>
<th>用户名</th>
<th>密码</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
<% adminlist.forEach(function(data){ %>
<tr>
<td><%= data.id %></td>
<td><%= data.user %></td>
<td><%= data.password %></td>
<td><%= data.age %></td>
</tr>
<% }) %>
</tbody>
</table>
<% } %>
<% } else {%>
<strong>登录失败 <a href="/">回首页</a></strong>
<% } %>
</div>
</div>
<% include footer.html %>

此时启动 app 打开 http://localhost:3000/ 尝试登陆(用户名密码自然在上文哦~)

小练习:获取 Express 中 HTTP 请求参数:query、body、params

放个小图:

案例小结:以上数据库操作 CURD 只是用到了 Retrieve ,其实API大同小异

6.3、增强案例:支持登陆并新增修改会员信息的系统,还得支持 session ~

待续

本次练习源码: nodejs-exercise

本次扩展: NodeJS+Mongodb+Express做CMS博客系统(符合MVC)

本文参考: THE DEAD-SIMPLE STEP-BY-STEP GUIDE FOR FRONT-END DEVELOPERS TO GETTING UP AND RUNNING WITH NODE.JS, EXPRESS, JADE, AND MONGODB By Christopher Buecheler


本节完

NodeJS实战:Express+Mongoose+ejs的更多相关文章

  1. 【NodeJS】---express配置ejs mongoose route等

    express创建项目 命令行下: express prj_name cd prj_name && npm install ejs html var ejs = require('ej ...

  2. Windows环境下,从零开始搭建Nodejs+Express+Ejs框架(二)---安装Express,ejs

    安装Express,ejs的前提是一定要先安装nodejs,具体安装方法请查看 http://www.cnblogs.com/tfiremeteor/p/8973105.html 安装Express和 ...

  3. nodejs下express+ejs环境搭建

    nodejs下express+ejs环境搭建   分类: Nodejs 1.进入需要创建项目的目录    cd F:\nodeCode     2.创建一个带ejs模板工程,工程名为haha    e ...

  4. nodejs之express静态路由、ejs

    1.静态路由与ejs使用 /** *1.安装ejs npm install ejs --save-dev * *2.express 里面使用ejs ,安装以后就可以用,不需要引入 * *3.配置exp ...

  5. nodejs创建express+ejs项目

    很多同学跟着 node.js开发指南 学习用 express+ejs 创建项目的时候,却总是无法成功,如: 运行 以下命令去创建 express+ejs 创建项目 $ express -t ejs m ...

  6. 只需几分钟跟小猫学前端(内含视频教程):nodejs基础之用express、ejs、mongdb建设简单的网站

    开门见山视频教程 https://v.qq.com/x/page/d0645s79xrq.html 前 言: 这是小猫的第二篇node教程,第一篇教程是一个简单的试水,小猫的node教程面向对象为没有 ...

  7. Node.js 入门:Express + Mongoose 基础使用

    前言 Express 是基于 Node.js 平台的 web 应用开发框架,在学习了 Node.js 的基础知识后,可以使用 Express 框架来搭建一个 web 应用,实现对数据库的增删查改. 数 ...

  8. Nodejs安装express提示不是内部或外部命令

    安装nodejs安装包后,通过npm安装express后,运行express提示" express"不是内部或外部命令. c:\express -t ejs web 原因是版本问题 ...

  9. nodejs安装express

    最近在看<Node.js开发指南>,看到使用nodejs进行web开发的时候,准备创建ejs项目遇到问题了, 书上命令为: 1 express -t ejs microblog 可是执行后 ...

随机推荐

  1. STL练习题续

    //zjnu 1399 //sort 数组可用//vector sort(vector) #include<iostream> #include<algorithm> usin ...

  2. springMVC注解启用及优化

    使用注解的原因 最方便的还是启用注解 注解方便,而且项目中很流行. 配置文件尽量减少,主要使用注解方式. Springmvc的注解是在2.5版本后有了注解,如何开启注解配置文件 Web.xml文件中不 ...

  3. Movies

    码头风云欲望号街车 不可思议的收缩人 The Incredible Shrinking Man (1957) 风之谷 西域威龙 对话 天地无限 现代启示录 黑暗之心 Hearts of Darknes ...

  4. 查询指定网段可用IP脚本

    1.脚本内容: #vi hhh 添加以下内容: #!/bin/bash read -p "Please keyin the network segment: (e.g. 10.88.1) & ...

  5. UNET学习笔记1 - 总览

    UNET为两类人设计: (1)使用Unity开发简单多人在线游戏.这类用户可以从NetworkManager或者the High Level API开始: (2)开发复杂多人在线游戏或者开发网络服务. ...

  6. C++混合编程之idlcpp教程Python篇(9)

    上一篇在这 C++混合编程之idlcpp教程Python篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程PythonTutorial7中除了四个文件PythonTu ...

  7. .net 第二周学习

    这周更进一步的介绍了.net,通过作业的练习,有那么一点点的成就感,相对于前端,成就感还不是很大,但是我还是会继续加油  学习.net,看着他们周末只能呆在寝室写网页,顿时我就高兴了:        ...

  8. Anciroid的IPC机制-Binder概述

    在Linux系统中,是以进程为单位分配和管理资源的.出于保护机制,一个进程不能直接访问另一个进程的资源,也就是说,进程之间互相封闭.但是,在一个复杂的应用系统中,通常会使用多个相关的进程来共同完成一项 ...

  9. 可在广域网部署运行的QQ高仿版 -- GG叽叽V2.4,增加远程协助、桌面共享功能(源码)

    QQ的远程协助.或者说桌面共享是一个非常实用的功能,所以,2.4版本的GG复制了它,而且,GG增强了桌面共享的功能,它可以允许指定要共享桌面的区域,这样,对方就只能看到指定区域的桌面,这对节省流量会非 ...

  10. dex分包变形记

    腾讯Bugly特约作者:李金涛 一.背景 就在项目灰度测试前不久,爆出了在 Android 3.0以下手机上安装时出现 INSTALL _ FAILED_DEXOPT,导致安装失败.这一问题意味着项目 ...