nodejs
nodejs是javascript语言编写的一个后台,nodejs实现的是后台功能
一.nodejs安装
1…msi 安装,安装选择下一步
2.运行node的环境是命令行功能
开始->cmd
win+r
打开的命令行功能默认的是C盘下的用户盘符
3.命令行工具常用命令
1.切换算盘 c盘->d盘 d:
2.进入文件夹:cd 文件夹名字
3.退出文件夹:cd …/
4.查看文件:dir
5.清空命令行:cls
6.创建文件夹:mkdir 文件夹名字
7.常用快捷键方式
tab:自动补全
上下键:查看输入历史纪录
在指定文件夹中快速打开命令行工具:找到指定文件夹,在文件夹中
shift+鼠标右键,在右键菜单中选‘在此打开命令行窗口’
8.停止当前命令:ctrl+c
定时关机:shutdown -s -t 秒数
取消定时关机:shutdown -a
二.nodejs的基本知识
1.体验nodejs
运行:在命令行工具中 node 文件名
//引入模块
var http=require('http')
//创建服务器:地址是local host:3000端口下开启的一个服务
http.createServer(function (req,res) {
//request 和 response 对象来处理请求和响应的数据,
// request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性
//response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据
//设置字符编码
res.writeHead(200,{'content-type':'text/plain','charset':' utf-8'})
//writeHead:这个方法有两个参数,第一个参数表示对应的编码的状态值,第二个表示对应的设置
//请求结果
res.end('体验nodejs')
}).listener(3000)
console.log('服务已启动')
2.需要了解的知识
1.回调函数
nodejs所有的函数都是异步执行的,适合做高并发(成本低),回调函数是异步执行的体现
回调函数中第一个参数是错误信息,第二个参数是请求成功返回的结果
2.事件
nodejs是事件驱动的,事件只要被提交就会自动进入事件队列中,事件队列会在事件循环中执行,当事件循环中某一事件执行完成后,会执行这个事件的回调函数。
注册事件:on()
执行事件:emit()
3.buffer
缓冲器:专门用来处理二进制数据的,js本身不能直接处理二进制,在后台的很多数据都是二进制的,所以nodejs定义了一个buffer专门来处理二进制数据
4.stream
流数据:后台中有很多数据都是以流数据形式传递的,所以nodejs中也封装了处理流数据的stream类
5.模块
nodejs是依据CommonJS编写的,符合CommonJS的规范,每个模块都是一个独立的功能,有独立的作用域模块的导入导出也是符合CommonJS的
导入:require(模块名)
导出:module.exports
nodejs中有很多已经定义好的模块(http/fs/os/path/url),这些模块都有自己的属性和方法,使用时需要查询API
三.npm
1.npm是下载nodejs时附带的一个工具,通过这个工具可以从npm官网下载程序
2.npm命令:
查看版本: npm -v
初始化package:npm init
packag.json是一个文件,这个文件中会保存当前的程序(应用)的基本信息、程
序的运行命令、程序的依赖、浏览器要求等等
安装程序:npm install 程序名 ***参考express官网
全局安装:npm install -g 程序名
项目安装:
a. npm install --save-dev 程序名 安装的程序会在package.json的devDependencies出现,这个对象中的数据都是开发环境中使用的,生产环境下是不需要的
b. npm install --save 程序名 安装的程序会在package.json的dependencies出现,这个对象中的数据 是开发环境、生产环境下中都需要的
卸载程序:npm uninstall 程序名
3.淘宝镜像:npm install -g cnpm --registry=http://registry.npm.taobao.org
速度快,国内的,使用时把npm换成cnpm即可
4.使用node_modules中的程序时: 不需要加node_modules文件夹的名字,直接使用程序名
四.路由接收数据
1.get请求
第一种:url?uname=feifei&uname=wanwan
获取前台通过这种形式传递的数据,需要使用nodejs中的一个基础模块 url
url.parse(urlString,true) //需要解析的url字符串,true表示会生成一个对象
urlString:需要通过req.url来获取
终止传递的数据在url.parse()返回值的query属性中,query中的值是对象形式的
//引入express程序
var express=require('express');
//引入url模块
var url=require('url');
//生成express的实例化对象
var app=express();
//路由
app.get('/',function (req, res) { //斜杠/表示一进根目录就要请求数据
res.send('hello world');
})
app.get('/boy',function (req, res) {
//获取urlString ,req是前端发来的请求,写在域名后面+?
var urlString=req.url
//转成对象,保留query
var urlObj=url.parse(urlString,true)
console.log(urlObj.query)
res.send('feifei');
})
app.get('/girl',function (req, res) {
res.send('wanwan');
})
//post接口
app.post('/we',function (req, res) {
res.send('feifeiwanwan');
})
var server=app.listen(3000,function () {
console.log('服务器启动了')
})
第二种:url/xiaoming/18 知乎网携带数据形式就是这种 restful
获取restful数据参数:
第一步:需要在接口中配置
app.get(’/boy/:uname/:age’)
第二步:获取
app.get(’.boy/:uname/:age’,function(req,res){
req.params(‘uname’)
})
代码:
var express=require ('express')
var app=express();
//get路由,携带数据 url/query1/query2
app.get('/boy/:uname/:age',function (req,res) {
res.send(req.params)
})
app.listen(3333,function () {
console.log('启动3333端口')
})
2.post请求
注意1:在获取post参数时需要额外引入一个组件 body-parser,然后需要配置这个组件
var bodyParser=require(‘body-parser’)
app.use(bodyParser.urlencoded({
extended:true
}))
注意2:使用postMan来测试post接口时,需要携带的参数要选body选择中的x-www-urlcoded
第一种:req.body来获取,建议使用
第二种:req.params()来获取,不建议使用
代码:
var express=require(‘express’)
//引入一个能让post接收参数的组件body-parser
var bodyParser=require(‘body-parser’)
var app=express();
//配置body-parser
app.use(bodyParser.urlencoded({
extended:true
}))
//配置解决跨域问题的方法
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By", ' 3.2.1');
res.header("Content-Type", "application/json;charset=utf-8");
next();
});
//post路由
app.post('/girl',function (req,res) {
//通过req.body来获取
//res.send(req.body)
//通过req.params()方法来获取,建议使用req.body来获取
console.log(req.param('name'))
res.send('请求完成')
})
app.listen(3000,function () {
console.log('启动3000')
})
五.跨域问题
//配置解决跨域问题的方法
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By", ' 3.2.1');
res.header("Content-Type", "application/json;charset=utf-8");
next();
});