从去年11月份到现在,一直想去学习nodejs,在这段时间体验了gulp、grunt、yeomen,fis,但是对于nodejs深入的去学习,去开发项目总是断断续续。
今天花了一天的时间,去了解整理整个学习思路,以下是我的学习分享,是入门级学习体验适合node+mongodb开发小白,node已玩过很久的大神这篇文章可能不适合。
开篇来个例子:
客户端表单页面:
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"> <title>表单页面</title> </head> <body> <form action="http://localhost:3000/" method ="post"> <input type="text" name="title"/> <textarea name="text" id="" cols="30" rows="10"></textarea> <input type="submit" /> </form> </body> </html>
服务器的页面(注意通过http.createServer创建的服务端,只支持post提交,get提交不行,get是取url):
var http = require("http"); //注意require 引入的是module里面的模块可以不用加../ ./ ../../这种相对符,其他如果是同级也得加./才能引入成功 var open = require("child_process"); var querystring = require("querystring"); var server = http.createServer(function(req,res){ var post = ''; req.on('data',function(chunk){ post += chunk; }); req.on('end',function(){ post = querystring.parse(post); res.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"}); res.write(post.title); res.write(post.text); res.end(); }); }).listen(3000,'127.0.0.1'); open.exec("start http://127.0.0.1:3000");
这个一个简单的例子,我们实现前台表单提交,后台获取数据。
通过这个简单的例子,我们可能想要做更复杂的的项目,那我们该如何下手呢,node+express+mongodb:
第一部分,基本知识点概要
express--一个简洁而灵活的 node.js Web应用框架
mongodb--适合node的关系型数据库
Mongoose -- Mongoose是MongoDB的一个对象模型工具,既类似ORM,让NodeJS更容易操作Mongodb数据库,Mongoose文档
node模版引擎--ejs,jade node模版引擎的深入探讨
Web 模板 Jade、EJS、Handlebars 万行代码解释效率比较,Jade 完败 https://cnodejs.org/topic/50e70edfa7e6c6171a1d70fa
EJS --http://www.embeddedjs.com/ github文档 -- https://github.com/tj/ejs
Jade —— 源于 Node.js 的 HTML 模板引擎 http://segmentfault.com/a/1190000000357534
JadeAPI --- http://www.nodeclass.com/api/jade.html#doctype
mongodb --- http://docs.mongodb.org/manual/ 手册
MongoDB介绍及安装 -- http://www.cnblogs.com/lipan/archive/2011/03/08/1966463.html
什么是MongoDB ? --- http://www.w3cschool.cc/mongodb/mongodb-intro.html
Express ( http://expressjs.com/ ) 除了为 http 模块提供了更高层的接口外,还实现了
许多功能,其中包括:
路由控制;
模板解析支持;
动态视图;
用户会话;
CSRF 保护;
静态文件服务;
错误控制器;
访问日志;
缓存;
插件支持。
Express 提供了路由控制权转移的方法,即回调函数的第三个参数next,通过调用next(),会将路由控制权转移给后面的规则。
这里重点分析一下ejs模板引擎,因为以后的项目了,可能我将大多用ejs,因为它十分简单,而且与 Express 集成良好。由于它是标准 JavaScript 实现的,因此它不仅可以运行在服务器端,还可以运行在浏览器中。
我们在 app.js 中通过以下两个语句设置了模板引擎和页面模板的位置:
app.set('views', __dirname + '/views'); app.set('view engine', 'ejs');
如何将ejs模版引擎的后缀.ejs设置为.html
// 定义EJS模板引擎和模板文件位置,也可以使用jade或其他模型引擎 app.set("views",path.join(__dirname,'ejviews')); //注册html模板引擎 将模版页后缀换成.html app.engine('.html',ejs.__express); //将模板引擎换成html app.set('view engine', 'html');
ejs 的标签系统非常简单,它只有以下3种标签。
<% code %>:JavaScript 代码。
<%= code %>:显示替换过 HTML 特殊字符的内容。
<%- code %>:显示原始 HTML 内容。
我们可以用它们实现页面模板系统能实现的任何内容。
注意:由于新版本不支持layout.ejs,解决方案
安装模块express-partials var partials = require('express-partials'); app.use(partials()); 可以在layout里面设置指定layout层 app.get('/',function(req,res){ res.render('index',{title:'imooc home',name:"pfan",content:"大家好,我来自火星,我的任务是奋斗!",layout:"layout"}); res.send('The time is ' + new Date().toString()); });
在 app.js 的中 app.configure 中添加以下内容,这样页面布局功能就被关闭了。 app.set('view options', { layout: false });
或者用第二种方案:上传代码例子
index.html文件代码:
<% include header.html %> <h1><%= title %></h1> <p>Welcome to <%= name %></p> <div class="red_txt"> <%= content %> </div> <% include footer.html %>
header.html代码:
<!DOCTYPE html> <html> <head> <title><%= title %></title> <meta charset="UTF-8"> <meta name="keywords" content="express"> <meta name="description" content="express"> <meta name="author" content="pingfan"> <link rel='stylesheet' href='/stylesheets/style.css' /> </head> <body>
footer.html代码:
<link rel='stylesheet' href='/javascripts/fastclick.js' /> </body> </html>
第二部分,配置开发安装包
① 配置package.json --- npm init初始配置package包依赖
{ "name": "pfan", "version": "1.0.1", "description": "pfan", "main": "app.js", "dependencies": { "express": "^4.12.4", "jade": "^1.10.0", "mongoose": "^4.0.3" }, "devDependencies": { "body-parser": "^1.12.4" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" }
这里注意:其实配置package.json非常重要,我们写好所需的依赖模块,然后通过 npm install 就可以将参数里面的依赖一起进行安装,这里其实,我们可以在安装 npm install express generator 生成node项目的目录结构和依赖模块的package.json
②快速建立web mvc 目录结构
Express是一个轻量级、简洁、易用的Node.js Web MVC开发框架
全局安装,可以快速建立目录结构web mvc目录结构
npm install -g express-generator
创建 express webmvc目录结构项目
express devexpress
③安装node module包依赖npm install express
npm install express //web应用框架 npm install jade //模版引擎 npm install ejs //模版引擎 npm install mongoose //MongoDB的一个对象模型工具,操作更简单 npm install mongodb //MongoDB的驱动 npm install serve-favicon //统一设置网站icon npm install morgan //HTTP 请求日志中间件 npm install cookie-parser //cookie解析器 npm install body-parser //定义数据解析器 npm install bower -g bower install bootstrap
注意:提出一个问题,就是我们在命令窗口,执行npm install 会执行package.json里面的包依赖,则我们通过express 项目名称 这样去执行,之后在通过npm install 就可以了执行项目案例里面的依赖,从而安装整个项目框架
⑤启动express项目
npm start //貌似现在的项目变成这样启动了
简单的路由相关方面案例:
var express = require("express"); var app = express(); var open = require("child_process"); var path = require('path'); var port = process.env.PORT || 3000; //新增 var server = app.listen(3000,function(){ console.log("listening on port %d",server.address().port); }); //设置引擎 app.set("views","./views"); app.set("view engine","jade"); //设置样式路径 app.use(express.static(path.join(__dirname, 'public'))); console.log(path.join(__dirname, 'public')); //设置路由 app.get('/',function(req,res){ res.render('index',{title:'imooc home',content:"I am welcome you"}); }); app.get('/users:22',function(req,res){ res.render('users',{title:'imooc details'}); }); open.exec("start http://127.0.0.1:3000")
第三部分,mongodb的坑 ---mongodb文档(有些老旧的api以作更改)
1.安装
首先,安装mongodb,直接解压安装,这里不再赘述。
下面,我们来讲mongodb和node连接起来,在工程文件夹webapp
下新建data
用来存放数据
启动mongodb服务器 访问http://localhost:27017判断是否开启成功
cd D:\Program Files\mongodb\bin //进入到mongodb 中bin文件下 mongod -- dbpath "D:\Program Files\mongodb\data" //关联新建的data文件来存放数据
解释:
mongod : 启动程序命令 --dbpath : 的数据库存放路径 --logpath : 的日志文件路径 --logappend : 以追加方式,写日志文件 --auth : 是否进行用户认证,加上后,MongoDB会使用用户认证方式登录。 --port : 端口号,可以自定义,默认 27017 --fork : 服务是否以后台运行的方式运行 --bind_ip : 限制特定IP地址访问
关联项目
cd node/webapp
mkdir data //新建data文件用来存放数据
出现这样的结果,说明连接mongodb成功了!
、
2.创建数据库
进入mongodb的安装目录D:\Program Files\mongodb\bin,敲命令mongo,切换数据库webapp
cd D:\Program Files\mongodb\bin //进入目录 mongo //执行mongo use webapp //使用webapp数据库,切换数据库
插入一个usercollection
表,执行:
db.usercollection.insert({ "username" : "testuser1", "email" : "testuser1@testdomain.com" })
执行,查看插入的数据,是否成功
db.usercollection.find().pretty() //查看插入的数据,是否成功
3.给数据库配置用户名和密码
cd D:\Program Files\mongodb\bin //进入目录 mongo //执行mongo use webapp //使用webapp数据库,切换数据库 db.createUser({createUser:"test",pwd:"test",roles:[{role:"dbOwner",db:"webapp"}]}) //设置用户名密码,老版本用的是db.addUser注意 show users //webapp现在已存在的用户
安装mongodb还会有很多的坑,我也没有找到好的解决方案,给大家提供一些好的mongodb参考资料:
Node.js与MongoDB在Windows环境下的安装 https://cnodejs.org/topic/524040e9101e574521760713
MongoDB在windows下安装配置 http://www.cnblogs.com/lsc183/archive/2012/08/16/mongodb.html
MongoDB 学习笔记 - 1、如何将MongoDB做一项Windows服务启动 http://www.cnblogs.com/sslshopper/archive/2012/11/26/2789241.html
Nodejs学习笔记(十)--- 与MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门 http://www.cnblogs.com/zhongweiv/p/node_mongodb.html
注意一个问题:我们在操作mongodb时,可能很多时候通过安装模块 npm install mongodb 驱动模版,或者npm install mongoose 通常来说mongoose 更好用,但是我们在先装了mongodb驱动之后,会导致mongoose安装出错,解决办法:
错误图片:
npm unistall mongodb
npm cache clean
npm install
安装成功图片:
注意一个问题:可能我们在运行的时候经常遇到乱码的情况,这里给大家几种解决方案
1.检查所有的js和html文件以及引擎模版都用UTF-8编码保存
2.设置res.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"});或者res.header("Content-Type", "application/json; charset=utf-8");
使用mongoose和mongoodb时遇到的问题(解决办法):
当我们使用mongoose操作mongodb时,会遇到如下问题(非常头痛):
解决办法如下:
其实我们只需要找到\node_modules\mongoose\node_modules\bson\node_modules\bson-ext\ext文件下的index.js文件:
我们只需要将路径改为指定的bson模块即可,简单粗暴的方法:
安装 bson npm install bson
将其路径改为 bson = require('bson');
mongoodb模块下参照http://www.tuicool.com/articles/NNbiYr
注意问题:
使用mongoose和mongoodb时遇到的问题:
http://www.cnblogs.com/scaleworld/p/4314742.html#3195147
http://blog.csdn.net/sanjay_f/article/details/44941077
这里讲一个我认为的express与http.createServer之间容易产生的一个误区(以下是express3.0的创建服务器的写法):
var express = require('express'), //引入express模块 app = express(), server = require('http').createServer(app); app.use('/', express.static(__dirname + '/www')); //指定静态HTML文件的位置 server.listen(80);
但其实我们用http模块创建服务器:
var http = require("http"), fs = require("fs"), url = require("url") , //解析请求url querystring = require("querystring") //获取hash值; var server = http.createServer(function(req,res){ var url = url.parse(req.url); var data = fs.readFileSync(url,"uth-8"); res.writeHead(200, { "Content-Type": "text/html;charset=UTF-8" }); res.write(data); res.end(); }).listen(3000,function(){console.log("服务器已经开始监听3000端口")});
两者对比,其实express也只有一个server的实例,然后app.use,app.get,app.set,等都是express里面的回调方法而实现服务器将数据返还给客户端而已。
最后资源分享:
express例子:https://github.com/pingfanren/express
express与数据库的例子:https://github.com/pingfanren/expressSimpleBlog
博文:http://www.cnblogs.com/myzhibie/
express例子:https://github.com/nswbmw/N-blog/wiki/_pages
叶小钗博文:http://www.cnblogs.com/yexiaochai/p/3527418.html
nodejs教程(很全面的课程) :https://github.com/alsotang/node-lessons
NodeJS实战:Express+Mongoose+ejs : http://www.cnblogs.com/highsea90/p/4308794.html
MongoDB的应用 : http://javascript.ruanyifeng.com/nodejs/mongodb.html
node错误问题汇总:
http://www.cnblogs.com/liuswi/p/4030216.html