综合编程

Node.js 入门一下

微信扫一扫,分享到朋友圈

Node.js 入门一下

Node.js是一个机遇Chrome V8引擎的JavaScript运行环境

Node.js的包管理器npm,是全球最大的开源生态库系统

Node.js可解析js代码,没有浏览器安全级别的限制

一.开发环境配置

官网: https://nodejs.org/en/

API文档: http://nodejs.cn/api/events.html

如果需要安装多个版本

1).docker

2).使用nvm来安装并维护( 推荐

项目地址: https://github.com/nvm-sh/nvm

# 1.安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
# 2.配置环境变量
#linux下  .bash_profile或.bash_rc
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
# windows系统。。。

3.配置加速镜像:

# 同样在上面的配置文件
export NVM_NODEJS_ORG_MIRROR=http://npm.taobao.org/mirrors/node

安装node

# 安装指定版本
nvm install 8.0.0
# 或安装最新的稳定版本
nvm install --lts
# 或安装最新的版本
nvm install node
# 查看安装的版本
nvm ls
# 查看当前版本
node -v
# 切换版本
nvm use 6.11.2

体验一下

在终端进入node命令行: node , 之后可以输入js代码了

在终端里面,不用受到浏览器里面的一些限制(但是本地环境没有 dombom 的操作)

比如,查看本地进程 process

执行文件: node index.js

不用每次写完都运行命令来执行

安装 nodemon , 实时侦测文件的变化

npm install nodemon -g  # 全局安装

npm使用国内源:

# 永久
npm config set registry https://registry.npm.taobao.org

或安装使用 cnpm 命令

使用 nodemon

nodemon index.js
# 这样就可以实时侦测了

使用其他版本node来运行脚本

# 1.指定版本来运行
nvm run 6.1.2 index.js
#2.使用配置文件
.nvmrc
#内容直接写版本号,
6.1.2
#
nmp use
#接下来运行就可以了
node index.js

二. 模块(包)与CommonJS

Node.js三种模块

  1. 内置的Node.js模块

    const os = require('os')  // require 载入模块
    console.log(os.hostname()); // 显示主机名
    
  1. 第三方的Node.js模块( https://www.npmjs.com )

    ​ 把包用npm引进来(可以创建配置文件来管理 npm init ,根据情况填写回撤,会自动创建 package.json

    ​ 在命令行输入 npm install request --save 安装在配置信息的依赖 dependencies

    ​ 会在我们的包里面自动创建一个文件夹 node_modules , 我们安装的包就会在里面了

    ​ 载入模块同上

    ​ 然后开始使用第三方模块

    const request = require('request')  //自动先从自己的模块找,找不到就会到我们目录下配置文件夹下找
    request({
    url: 'https://api.douban.com/v2/movies/top250',
    json:true,
    }, (error, response, body) => {
    console.log(JSON.stringfy(body, null, 2));
    });
    
  1. 自定义的Node.js模块(要按照CommonJS规范)

    新建一个目录 src ,里面新建一个js文件(模块)

    //自定义模块
    const hello = () =>{
    console.log("hello~");
    }
    //暴露接口供外部使用(第一个hello是模块的名字,第二个hello是要用的方法)
    module.exports.hello = hello
    

    调用

    const greet = require("./src/greeting.js")
    greet.hello()
    

三. NPM-包管理工具

npm使用

npm -v
npm info

镜像源

# 查看
npm config get registry
# 设置
npm config set registry http://registry.npmjs.org

升级node

#
npm install n -g

查看当前目录下安装了哪些node包

npm ls

查看当前npm用户

npm whoami

npm清理缓存

npm cache clean -f

npm安装模块

# i = install
npm i forever -g  # 全局
npm install xxx   # 利用 npm 安装xxx模块到当前命令行所在目录;
npm install -g xxx  # 利用npm安装全局模块xxx;
npm install xxx  # 安装但不写入package.json;
npm install xxx –save  # 安装并写入package.json的”dependencies”中;
npm install xxx –save-dev # 安装并写入package.json的”devDependencies”中。

npm 删除模块

npm uninstall xxx     # 删除xxx模块;
npm uninstall -g xxx  # 删除全局模块xxx;

更新模块

npm update

检查模块是否已经过时

npm outdated

在项目中引导创建一个package.json文件

npm init

发布模块

npm publish

查看node安装路径

查看node安装路径

四.深入浅出Node核心模块API

1). url

记得要导入模块

1.parse

url.parse(urlStr, [parseQueryString], [slashesDenoteHost])

url.parse("https://www.baidu.com")
# 井号后面是hash
url.parse("https://www.baidu.com:8080/api.php?from=xp&course=node#level")
#第二个参数 parseQueryString 为true时将使用查询模块分析查询字符串,默认为false
url.parse("https://www.baidu.com", true)
#第三个参数 如果设置成true,//foo/bar 形式的字符串将被解释成 { host: ‘foo', pathname: ‘/bar' }
url.parse("https://www.baidu.com", true,true)

2.format

将一个解析后的URL对象、转成、一个格式化的URL字符串。

url.format(urlObj)

var url = require('url');
var a = url.format({
protocol : 'http' ,
auth : null ,
host : 'example.com:8080' ,
port : '8080' ,
hostname : 'example.com' ,
hash : null ,
search : '?a=index&t=article&m=default',
query : 'a=index&t=article&m=default',
pathname : '/one',
path : '/one?a=index&t=article&m=default',
href : 'http://example.com:8080/one?a=index&t=article&m=default'
});
console.log(a);
//输出结果:http://example.com:8080/one?a=index&t=article&m=default

3.resolve

为URL或 href 插入 或 替换原有的标签,两段解析成一个完整的url

url.resolve(from, to)

var url = require('url');
var a = url.resolve('/one/two/three', 'four') ,
b = url.resolve('http://example.com/', '/one'),
c = url.resolve('http://example.com/one', '/two');
console.log(a +","+ b +","+ c);
//输出结果:
///one/two/four
//http://example.com/one
//http://example.com/two

2). QueryString

1.querystring.escape(str)

转义为url编码

querystring.escape('<大家好>')

2.querystring.unescape(str)

反转义

querystring.unescape('%3C%E5%A4%A7%E5%AE%B6%E5%A5%BD%3E')

3.querystring.stringify(obj,[, seq[, eq[, options]]])

序列化

1.  querystring.stringify({name:'chenshuai',ago:21,job:"web"})
2.   querystring.stringify({name:'chenshuai',ago:21,job:"web"},".") //第二个参数可以修改连接的&
3. querystring.stringify({name:'chenshuai',ago:21,job:"web"},".",":")//第三个参数可以修改key与value之间的字符串

4.querystring.parse(str[, sep[, eq[, options]]])

反序列化

// querystring.parse('字符串','&','=') //默认状态(字符串,分隔符,键与值)
1. querystring.parse('name=chenshuai&ago=21&job=web')
2.querystring.parse('name=chenshuai.ago=21.job=web','.')//返序列化时要注意格式
3.querystring.parse('name:chenshuai.ago:21.job:web','.',':')

3).http(s) 模块

1.get方法

案例,http小爬虫

var http = require('http')
var https = require('https') //https网站使用(和http的方法是一样的)
var cherio = require('cherio') // 类似于jQuery
var url = "https://www.lagou.com"
// 解析源代码
function parseMenu(html){
//先导入html,然后再进行处理
var $ = cherio.load(html)
var menu = $('.category-list')
var menuData = []
menu.each(function(index,value){ //遍历
var menuTitle = $(value).find('h2').text() //一级标题
var menuLists = $(value).find('a')
var menuList = []
menuLists.each(function(inde, val){ //遍历
menuList.push($(val).text())  //a元素的text
})
menuData.push({
menuTitle:menuTitle,
menuList:menuList
})
})
return menuData
}
//打印
function printMenu(menu)
{
menu.forEach(function(val){
console.log(val.menuTitle + 'n');
val.menuList.forEach(function(value){
console.log(value);
})
})
}
// get请求
https.get(url, function(res){
var html = '';
res.on('data', function(data){
html += data;
})
res.on('end', function(){
// 打印的是网页源代码
//console.log(html);
var result = parseMenu(html)
printMenu(result)
})
res.on('error', function(err){
console.log(err);
})
})

2.Request方法

GET获取异步数据

//Http模块的request方法的get来获取异步数据 豆瓣电影Top250
const https = require('https')
var options = {
hostname: 'douban.uieee.com',
port: 443,
method: 'GET',
path: '/v2/movie/top250'
}
var responseData = ''
var request = https.request(options, (response) =>{
response.setEncoding('utf8')
response.on('data', (chunk)=>{
responseData += chunk
})
response.on('end',()=>{
JSON.parse(responseData).subjects.map((item) =>{
console.log(item.title); // 第一页的电影标题
})
})
})
request.on('error', (error)=>{
console.log(error);
})
request.end()

POST方法提交表单

//Http模块的request方法的post方法提交表单
const http = require('http')
const qs = require('querystring')
//序列化
var postData = querystring.stringfy({
'question[title]':'哈哈哈',
'question[content]':'我的内容'
})
var options = {
hostname: 'www.codingke.com',
port: 80,
method: 'POST',
path: '/ajax/course/question'
headers: {  // 因为登录之后才能提交,所有这里...
'Cookie':'xxxx',
'User-Agent':'xxxx',
'xxx':'xxx',
'Content-Length':postData.length
}
}
var request = http.request(options, (res) =>{
console.log('Status:' + res.statusCode);
res.setEncoding('utf8')
res.on('data', (chunk)=>{
console.log(chunk);
})
res.on('end',()=>{
console.log("表单提交完毕");
})
})
//提交表单
request.write(postData)
request.on('error', (error)=>{
console.log(error);
})
request.end()

4). Events事件模块

使用事件: EventEmitter

事件的参数

只执行一个的事件监听器

比如:更新、发布 都是一个事件

小例子:

const EventEmitter = require('events')
class Player extends EventEmitter{}  //继承类
//实例化对象
var player = new Player()
//自定义一个函数(不过我这里是用的匿名函数)
function ev1(){
console.log("嘻嘻");
}
//监听事件(这里用的匿名函数)
player.on('play', (track)=>{
console.log(`正在播放: 《${track}》`);
})
// emit订阅事件,传递参数
player.emit('play',"被风吹过的夏天")
//事件定义之后,可以多次触发
player.emit('play',"朋友请听好")
// once 不论你定义几次,只会触发一次
player.once('play',"陈情令")
// removeListener 移除指定的监听事件
//player.removeListener('')
// removeAllListeners    移除所有的监听事件
// eventNames方法可以罗列出已注册的所有监听器的事件,类型为数组

5). fs 文件系统

得到文件与目录信息: stat

创建一个目录: mkdir

创建文件并写入内容: writeFile , appendFile

读取文件的内容: readFile

列出目录的东西: readdir

重命名目录或文件: rename

删除目录与文件: rndir , unlink

const fs = require('fs')
fs.stat('index.js', (error,stats) => {
if(error){
console.log(error);
}else{
console.log(stats);  //打印文件的一些信息
console.log(`文件:${stats.isFile()}`);
console.log(`目录:${stats.isDirectory()}`);
}
})
//新建目录
fs.mkdir('logs' (error) =>{
if(error){
console.log(error);
}else{
console.log("成功创建目录: logs");
}
})
// 往文件写内容(如果文件不存在,就先创建)
fs.writeFile('logs/hello.log', "hello ~n" , (error) =>{
if(error){
console.log(error);
}else{
console.log("成功向文件logs/hello.log写入内容 ");
}
})
// 修改文件内容
fs.writeFile('logs/hello.log', "你好 ~n" , (error) =>{
if(error){
console.log(error);
}else{
console.log("成功修改文件logs/hello.log内容 ");
}
})
// 追加文件内容
fs.appendFile('logs/hello.log', "新添加的一行 ~n" , (error) =>{
if(error){
console.log(error);
}else{
console.log("成功添加内容文件logs/hello.log ");
}
})
// 读取文件内容
fs.readdFile('logs/hello.log','utf8', (error,data) =>{
if(error){
console.log(error);
}else{
console.log("成功读取文件logs/hello.log内容");
console.log(data);
//console.log(data.toString());
}
})
// 读取文件夹列表
fs.readdir('logs/', (error,data) =>{
if(error){
console.log(error);
}else{
console.log("成功读取文件夹logs/列表 ");
console.log(data);
//console.log(data.toString());
}
})
//对文件重命名  、修改文件夹名字一样
fs.rename('logs/hello.log', "logs/hello_new.log" , (error) =>{
if(error){
console.log(error);
}else{
console.log('重命名文件名logs/hello.log ");
}
})
//循环删除文件
fs.readdirSync('logs').map((file) =>{
fs.unlink(`logs/${file}`, (error) =>{
if(error){
console.log(error);
}else{
console.log(`成功删除文件logs/${file}`);
}
})
})
//删除文件夹
fs.rmdir('logs',  (error) =>{
if(error){
console.log(error);
}else{
console.log('成功删除目录:logs/ ");
}
})

6). Stream

文件流

const fs = require('fs')
var fileReadStrem = fs.createReadStream('data.json')
var fileWriteStrem = fs.createWriteStream('data1.json')
var count = 0;
//读取文件流
fileReadStrem.once('data', (chunk) => {
console.log(chunk.toString());
})
fileReadStrem.on('data', (chunk) => {
console.log(`${ ++count } 接收到:${chunk.length}`);
//写入文件流
fileWriteStrem.write(chunk)
})
fileReadStrem.on('end', () => {
console.log("-- 结束  --");
})
fileReadStrem.on('error', (error) => {
console.log(error);
})

pipe

const fs = require('fs')
const zlib = require('zlib')
var fileReadStrem = fs.createReadStream('data.json')
var fileWriteStrem = fs.createWriteStream('data1.json')
fileWriteStrem.on('pipe', (source) => {
console.log(source); //将写入的内容通过管道打印一下
})
//读取文件流的内容放到文件写入流   管道
fileReadStrem
.pipe(zlib.createGzib())
.pipe(fileWriteStrem)

五.使用Node创建后端路由

使用supervisor运行

# 安装:
npm install supervisor -g
# 运行
supervisor router_1.js

最简单路由

router_1.js

var http = require('http')
var url = require('url')
var route = require('./modules/route.js')
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type':'text/html;charset=utf-8'})
if(req.url !== '/favicon.ico'){
var pathName = url.parse(req.url).pathname.replace(///,'') //http://localhost:8000/login就是login
console.log(pathName);
try{  //最简单的异常处理
route[pathName](req, res)
} catch(err){
route['home'](req, res)  //默认路由,如果不存在哪个路由,就返回这个路由
}
}
res.end()
}).listen(8000)
console.log('Server running at http://localhost:8000');

route.js

module.exports = {
home: (req, res) => {
res.write("欢迎来到首页")  // 默认路由
},
login: (req, res) => {
res.write("登录界面")  // 处理路由
},
registor: (req, res) => {
res.write("注册界面")  // 处理路由
}
}

读取图片

router_02.js

var http = require('http')
var url = require('url')
var route = require('./modules/route.js')
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type':'image/jpeg'})
if(req.url !== '/favicon.ico'){
var pathName = url.parse(req.url).pathname.replace(///,'') //http://localhost:8000/login就是login
console.log(pathName);
try{  //最简单的异常处理
route[pathName](req, res)
} catch(err){
route['home'](req, res)  //默认路由,如果不存在哪个路由,就返回这个路由
}
}
//res.end()
}).listen(8000)
console.log('Server running at http://localhost:8000');

route.js

var file = require('./file.js')
module.exports = {
home: (req, res) => {
res.write("欢迎来到首页")  // 默认路由
},
login: (req, res) => {
res.write("登录界面")  // 处理路由
},
registor: (req, res) => {
res.write("注册界面")  // 处理路由
},
img: (req, res) => {
//读取文件,也新建一个模块
file.readImg('./images/1.jpg', res)
}
}

file.js

var fs = require('fs')
module.exports = {
readImg: (file, res) => {
fs.readFile(file, 'binary', (err, data) => {
if(err) throw err;
res.writeHead(200, {'Content-Type':'image/jpeg'})
res.write(data, 'binary')
res.end()
})
}
}

文字和图片一起显示

使用html文件

views/home.html

<!<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>首页</title>
</head>
<body>
首页
<img src="https://www.tuicool.com/articles/img" alt="">
</body>
</html>

file.js

var fs = require('fs')
//读html文件
module.exports = {
readFile: (file, res) => {
fs.readFile(file, 'utf-8', (err, data) => {
if(err) throw err;
res.writeHead(200, {'Content-Type':'text/html; charset=utf-8'})
res.write(data)
res.end()
})},
readImg: (file, res) => {
fs.readFile(file, 'binary', (err, data) => {
if(err) throw err;
res.writeHead(200, {'Content-Type':'image/jpeg'})
res.write(data, 'binary')
res.end()
})
}
}

route.js

var file = require('./file.js')
module.exports = {
home: (req, res) => {
//res.write("欢迎来到首页")  // 默认路由
file.readFile('./views/home.html', res)
},
login: (req, res) => {
res.write("登录界面")  // 处理路由
},
registor: (req, res) => {
res.write("注册界面")  // 处理路由
},
img: (req, res) => {
//读取文件,也新建一个模块
file.readImg('./images/1.jpg', res)
}
}

router_03.js

var http = require('http')
var url = require('url')
var route = require('./modules/route.js')
http.createServer((req, res) => {
if(req.url !== '/favicon.ico'){
var pathName = url.parse(req.url).pathname.replace(///,'')
console.log(pathName);
try{  //最简单的异常处理
route[pathName](req, res)
} catch(err){
route['home'](req, res)  //默认路由,如果不存在哪个路由,就返回这个路由
}
}
//res.end()
}).listen(8000)
console.log('Server running at http://localhost:8000');

路由传递参数

1.get方式

login.html

<form action="./login" method="get">
<label for="email">
邮箱: <input type="text" name="email" value=""/>
</label>
<label for="password">
密码: <input type="password" name="password" value=""/>
</label>
<label for="submit">
<input type="submit" value="提交" />
</label>

toute.js

var file = require('./file.js')
var url = require('url')
module.exports = {
login: (req, res) => {
var urlObject = url.parse(req.url, true).query  // 通过url解析html表单数据
console.log(urlObject.email)
console.log(urlObject.password)
file.readFile('./views/login.html', res, req)
}
}

2.post方式

route.js

var file = require('./file.js')
var url = require('url')
var queryString = require('queryString')
module.exports = {
login: (req, res) => {
//post方式
var post = ''
req.on('data', (chunk) => {
post += chunk
})
req.on('end', () => {
var urlObject = queryString.parse(post) //返回一个url对象
console.log(urlObject.email);
console.log(urlObject.password);
})
file.readFile('./views/login.html', res, req)
}
}

输入的内容回显到本页面

file.js

  postReadFile:  (file, res, req, post) =>{
var urlObject = queryString.parse(post)
var array = ['email', 'password']
var reg;
fs.readFile(file, 'utf-8', (err, data) => {
if(err) throw err;
res.writeHead(200, {'Content-Type':'text/html; charset=utf-8'})
//处理
for(var i=0; i<array.length; i++){
reg = new RegExp('{' + array[i] + '}', 'gi')
data = data.replace(reg, urlObject[array[i]])
}
if(urlObject.email && urlObject.password){
data = data.replace(new RegExp('{infoClass}', 'gi'), '')
data = data.replace(new RegExp('{formClass}', 'gi'), 'hide')
}else{
data = data.replace(new RegExp('{infoClass}', 'gi'), 'hide')
data = data.replace(new RegExp('{formClass}', 'gi'), '')
}
res.write(data)
res.end()
})
},

route.js

login: (req, res) => {
//post方式
var post = '';
req.on('data', (chunk) => {
post += chunk
})
req.on('end', () => {
file.postReadFile('./views/login.html', res, req, post)
})
},

login.html

<div class="{infoClass}">
Email:{email} <br>
密码:{password}
</div>
<form action="./login" method="post" class="formClass">
<label for="email">
邮箱: <input type="text" name="email" value=""/>
</label>
<label for="password">
密码: <input type="password" name="password" value=""/>
</label>
<label for="submit">
<input type="submit" value="提交" />
</label>

最低3元一门 谁在代刷代考大学生网课?

上一篇

3月26日任天堂迷你直面会汇总

下一篇

你也可能喜欢

评论已经被关闭。

插入图片
偷得浮生半日闲 投稿者
我还没有学会写个人说明!
最近文章
  • 1 python-socket编程
  • 2 python-多线程
  • 3 Python之Scapy
  • 4 python-PyQuery
  • 5 python-Beautifulsoup
  • 6 07-mysql盲注
  • 热门栏目

    Node.js 入门一下

    长按储存图像,分享给朋友