什么是node.js
-
Node,js 不是一门语言,不是库,不是框架
-
node.js 是一个JavaScript运行时环境,可以解析和执行JavaScript代码
-
以前只有浏览器可以解析JavaScript代码。现在的可以完全脱离浏览器来运行,一切都归功于node.js
-
浏览器中的JavaScript
EcmaScript
基本语法
Array
Object
function
var
if
2 , BOM
3. DOM
-
Node.js中的JavaScript
-
-
EcmaScript
-
没有BOM,DOM
-
在Node这个JavaScript执行的环境中为JavaScript提供了一些服务器级别的操作API ,例如文件读写网络服务的构建,网络通信,http服务器等处理
-
-
文件的读取和写入
-
-
读取文件
-
require('fs').readFile('文件路径',回调函数function(error,data))
-
成功
-
data数据
-
error null
-
-
失败
-
data null
-
error 错误对象
-
-
-
-
写入文件
-
require('fs').writeFile('文件路径'.'文件内容',回调函数function(error){})
-
成功 error null
-
失败 error 错误对象
-
-
-
-
模块系统
-
node中只能通过require方法来加载执行多个JavaScript脚本文件
-
require加载只是执行其中的代码,文件和文件之间是模块作用域,不会有污染问题,可以避免变量命名冲突污染的问题,
-
模块与模块进行通信用exports对象,该对象默认是一个空对象
-
把需要被外部访问使用的成员手动挂载到exports接口对象中,谁来require这个模块,谁就可以得到模块内部的exports接口对象
a.js
var bExport = require('./b');;
console.log(bExport.foo)
console.log(bExport.add(1,2));
b.js
exports.foo = 'hello';
exports.add = function (a,b) {
return a+b;
}
核心模块
-
fs 文件操作模块
-
http 网络服务构建模块
-
os 操作系统信息模块
-
path 路径处理模块
http
-
乱码问题Content-Type
-
不同的资源对应的 Content-Type 是不一样,具体参照:http://tool.oschina.net/commons
-
res.setHeader('Content-Type','text/plain;charset=utf-8');
-
在浏览器中使用模板引擎
<body>
<script src="node_modules/art-template/lib/template-web.js"></script>
<script type="text/template" id="tp1">
我是{{name}}
我今年{{age}}
我喜欢{{each hobbies}} {{$value}} {{/each}}
</script>
<script>
var ret = template('tp1',{
name: 'libeibie',
age : 19,
hobbies :[
'吃',
'喝',
'玩'
]
}
);
console.log(ret);
</script>
</body>
-
在node中使用模板引擎
-
安装
-
nmp install art-template
-
-
-
javaScript 代码风格 参考Airbnb JavaScript Style
-
导出exports
-
把需要被外部访问使用的成员手动挂载到exports接口对象中,谁来require这个模块,谁就可以得到模块内部的exports接口对象
-
导出多个成员(必须在对象中)
-
exports.a = 1234
exports.b = 'hello'
exports.c = function(){
console.log('ccc')
}
export.d = {
foo : 'bar'
}
module.exports = {
foo : 'bar'
add :'function(x,y){
return x + y ;
}
- 导出单个成员(拿到的是函数,字符串)
module.exports = 'hello'
以下情况后者会覆盖前者
module.exports = 'hello'
module.exports = function(x,y){
return x + y ;
}
- 导出单个成员,必须使用module.exports,因为每个模块最终return的都是module.exports,而exports只是module.exports的一个引用。但有一种赋值方式比较特殊,‘exports = module.exports’,这个是用来重新建立引用关系的
-
nmp常用命令(npm5以上版本不需要加--save
-
npm init 生成package.json
-
npm init -y 可以跳过向导,快速生成
-
-
npm install (npm i)一次性把dependencies选项中的依赖项全部安装
-
npm install 包名 只下载
-
npm install --sava (npm i-S) 报名 下载并保存依赖项(package.json文件中的dependences选项)
-
npm uninstall(npm un)包名 只删除,如果有依赖会依然保存
-
npm uninstall --save 包名 删除的同时会把依赖信息也去除
-
npm help 查看使用帮助
-
npm 命令 --help 查看指定命令的使用帮助
-
Express
-
Express是Node.js web应用程序开发的框架
-
安装npm init -y, npm install express
-
app.use('/xxx/',express.static('./xxx/')) 省略第一个参数时,访问路径可以省略/xxx/
-
nodemon是一个基于Node.js开发的一个第三方命令行工具,nodemon来帮我们解决频繁修改代码重启服务器问题
-
安装 npm install --global nodemon
-
使用 nodemon xxx.js
-
-
hello world
var express = require('express')
var app = express()
))
app.use('/public/',express.static(path.join(__dirname, './public/')))
app.get('/',function (req,res) {
res.send('Hello,nihao')
})
app.get('/about',function (req,res) {
res.send('你好,express')
})
app.listen(3000,function () {
console.log('app is running')
})
在express中使用模板引擎
-
安装
-
nmp install --save art-template
-
npm install --save express-art-template
-
-
配置
app.engine('art',require('express-art-template'))
-
使用
app.get('/',function(req,res){
//express默认回去项目中的views目录下找index.html
res.render('index.html',{
title:'李贝'
})
})
-
如果想要给默认的views试图渲染存储路径,可以
app.set('views',目录路径)
-
重定向 res.redirect('')
-
获取数据 req.query 只能拿get请求参数
-
在express获取表单post请求体数据
-
安装
-
npm install body-parser
- 配置(配置一定要在挂载路由之前)
var bodyParser = require('body-parser')//引包
app.use(bodyParser.urlencoded({extended : false}))
//加入这个配置可通过req.body来获取表单post请求数据
app.use(bodyParser.json())
- 使用
app.post('/',function(req,res){})
app.use(function(req,res){
res.setHeader('Content-Type','text/plain')
res.write('you posted : \n')
})
-
package-lock.json
-
这个文件会保存node_modules中所有包的信息(版本,下载地址)这样的化重新npm install的时候速度就可以提升
-
从文件来看,有一个lock称之为锁,他可以锁定版本号,防止重新install时自动升级新版
-
-
异步编程
-
不成立的情况
-
function add(x,y) {
console.log('1');
setTimeout(function () {
console.log('2');
return x+y;
},1000);
console.log('3')
}
console.log(add(10,20))
- 回调函数获取结果
var ret;
function add(x,y,callback) {
console.log('1');
setTimeout(function () {
console.log('2');
ret = x + y;
callback(ret)
},1000)
console.log('3')
}
add(10,20,function (a) {
console.log(a);
})
-
mongodb非关系型数据库(最像关系型数据库的非关系型数据库系统)
-
与node创建链接
-
mongoDB的数据存储结构
-
数据库
-
集合(相当于mysql中的表)
-
文档(相当于mysql中的表记录)
-
-
(mongoose官网mongoosejs.com)
-
他是基于mongoDB官网的mongodb包进一步做了封装的第三方包
-
安装 npm i mongoose
-
链接
-
-
var mongoose = require('mongoose');
//1.链接数据库
mongoose.connect('mongodb://localhost/test');
mongoose.Promise = global.Promise;
//设计数据库
var Cat = mongoose.model('Cat',{name : String});
for(var i = 0 ;i<100; i++){
var Kitty = new Dog({name : 'maodou' + i});
Kitty.save( function (err) {
if(err){
console.log(err);
}
else {
console.log('miao');
}
})
}
- 增删改查操作
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
//1.链接数据库
mongoose.connect('mongodb://localhost/itcast');
//2.设计文档字段
var userSchema = new Schema({
username : {
type : String,
required : true
} ,
password : {
type: String,
required: true
},
email : {
type : String,
}
})
//3.将文档结构发布为模型
var User = mongoose.model('User',userSchema)
//添加数据
// var dog = new User({
// username: 'mantou',
// password: '12349',
// email: '11989@qq.com'
// })
// dog.save(function (err,ret) {
// if(err){
// console.log('保存失败');
// }
// else {
// // console.log(ret);
// }
// })
//查询数据
// User.find(function (err,ret) {
// if(err){
// console.log('查询失败')
// }else {
// console.log(ret)
// }
// })
// User.find({
// username: 'maodou'
// },function (err,ret) {
// console.log(ret)
// }
// )
// User.remove({
// username: 'mantou'
// },function(err,ret) {
// if(err){
// console.log('失败')
// }else {
// console.log(ret)
// }
// })
User.findByIdAndUpdate('5e33149b7ff0a44654199086',{
password: 1234567
},function (err,ret) {
if(err){
console.log('失败')
}else {
console.log(ret)
}
})
-
node 链接mysql数据库
-
安装 npm i mysql
-
模板案例
-
var mysql = require('mysql');
//1.创建链接
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : 'root',
database : 'node'
});
//2.链接数据库
connection.connect();
//执行数据库操作
connection.query('insert into node value(1,"李贝贝","1234")', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results);
});
//4.关闭数据库''
connection.end();
-
path路径操作模块
-
https://nodejs/org/dist/latest-v9.x/docs/api/path.html
-
path.basename(获取一个路径的文件名)
-
path.dirname(获取路径目录部分)
-
path.extname(获取路径的扩展名部分)
-
path.parse(把一个目录转化为对象)
-
root 根目录
-
dir 目录
-
base 包含后缀名的文件名
-
ext 后缀名
-
name 不包含后缀名的文件名
-
-
path.join(需要进行目录拼接的时候受用)
-
path.isAbsolute(判断是否是绝对路径)
-
-
node中的两个其他成员
-
_dirname 动态获取可以用来获取当前文件模块所属目录的绝对路径
-
_filename 动态获取可以用来获取当前文件的绝对路径
-
他俩不受执行node命令所属路径的影响用来解决相对路径不可靠问题
-
-
-
Session , Cookie
-
npm i express-session
-
var session = require('express-session')//引包
app.use(session({ //配置 ,一定要在挂载路由之前
secret: 'keyboard cat', //配置加密的字符串,在原有加密基础上和这个字符串拼接起来去加密,增加安全性,防止客户 //端恶意伪造
resave: false,
saveUninitialized: true})) //为true的话,无论使不使用session,都会直接给你分配一个id
//使用
req.session.user = 'libeibei' //添加
req.session.user //获取
-
node使用md5加密
安装Npm
npm i -S blueimp-md5
引入:
var md5 = require('blueimp-md5');
使用:
var body = req.body;
// 对密码进行 md5 重复加密body.password=md5(md5(body.password));