首页 > 学院 > 开发设计 > 正文

node.js入门

2019-11-08 00:48:32
字体:
来源:转载
供稿:网友
一、什么是NodeJSNode.js 是一个基于 Chrome V8 引擎的 javaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,成为世界上最大的开放源代码的生态系统。二、NodeJS怎样Node.js 可以解析JS代码(没有浏览器安全级别的限制)提供很多系统级别的API,如:文件的读写进程的管理网络通信......三、为什么要学习NodeJs列举一些基于Node的工具或者框架Node-Webkit:基于node的webkit的内核NodeOS:基于node的操作系统ExPRess:基于node的框架Jade:模板EJS:模板Forever:负载均衡PM2:负载均衡Log.io:浏览器打印各种输出日志,报错等Grunt、Gulp、Webpack:前端工程化工具Mocha、Karma:前端测试工具......四、学习nodeJS的五个网站node官网:https://nodejs.org/en/   -------下载node,官方API,更新日志,发布的动态npm官网:https://www.npmjs.com/search?q=    -------可以搜索你需要的模块,模块管理、组件安装github:https://github.com/search?utf8=%E2%9C%93&q=nodejs     ----源代码国外技术博客:http://stackoverflow.com/questions-----使用nodejs遇到的问题国内的技术博客:https://segmentfault.com/-----遇到的问题五、nodeJS的安装Mac系统的安装windows系统的安装其他系统的安装参照网址:http://www.runoob.com/nodejs/nodejs-install-setup.htmlv6.9.5 LTS  v7.5.0 Current偶数位为稳定版本:v6.8.x   v6.6.x   v6.4.x基数位为非稳定版本:v6.9.x   v6.7.x   v6.5.x六、搭建第一个WEB服务器本地创建一个文件server.js,代码采用es6编写const http = require("http");const homename = "127.0.0.1";const port = 3000;const server = http.createServer((req,res)=>{res.statusCode = 200;res.setHeader("Content-Type","text/plain");res.end("hello world");});server.listen(port,hostname,()=>{console.log(`server running at http://${hostname}:${port}/`);})es5的编写方法ar http = require('http');http.createServer(function (request, response) {// 发送 HTTP 头部 // HTTP 状态值: 200 : OK// 内容类型: text/plainresponse.writeHead(200, {'Content-Type': 'text/plain'});// 发送响应数据 "Hello World"response.end('Hello World/n');}).listen(8888);// 终端打印如下信息console.log('Server running at http://127.0.0.1:8888/');七、命令行中体验输入node即可进入控制台---交互式解释器--Node.js REPL表示一个电脑的环境,类似 Window 系统的终端或 Unix/linux shell,我们可以在终端中输入命令,并接收系统的响应。Node 自带了交互式解释器,可以执行以下任务:读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。执行 - 执行输入的数据结构打印 - 输出结果循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。八、helloworld创建一个文件hello.js,代码采用es5编写//console.log("hello world");启动一个服务器"/favicon.ico"打印两次helloworld九、模块和包管理工具commonJS规范根据这个规范,每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。依赖关系 定义    .js文件     命名空间 纠结的编程体验暴露接口代码组织 引用modules/pakages/system/filestems/binary/console/encodings/sockets/unit test...不同于jQuery,CommonJs是一套规范规范与实现的互为促进nodeJS、Webpack都基于CommonJS规范使用npm install 来安装模块使用镜像安装  cnpm install 案例展现十、NPM使用全局安装:相当于windows系统环境变量的配置本地安装:不加后缀安装:install写在:uninstall安装模块:npm install n -g升级node:n stable安装Forever:cnpm install forever -g本地安装underscore:cnpm install underscore查看模块版本号:cnpm info underscore选择版本安装:cnpm install underscore@1.0.3查看安装了那些模块:cnpm list如何管理模块package:cnpm initdependencies:项目依赖,通过--save加进去devDependencies:开发依赖,线上不需要---通过--dev加进去删除node_modules文件夹,执行命令 cnpm install只查看安装模块的中某一个模块的信息:cnpm list | grep gulp查看版本标识:cnpm outdatednrm模块--选择和切入源:cnpm install nrm -gnrm listnrm test----测试速度nrm use npm十一、nodejs API1、url网址解析url.parse(urlString[, parseQueryString[, slashesDenoteHost]])url.format(urlObject)url.resolve(from, to)┌─────────────────────────────────────────────────────────────────────────────┐│                                    href                                     │├──────────┬┬───────────┬─────────────────┬───────────────────────────┬───────┤│ protocol ││   auth    │      host       │           path            │ hash  ││          ││           ├──────────┬──────┼──────────┬────────────────┤       ││          ││           │ hostname │ port │ pathname │     search     │       ││          ││           │          │      │          ├─┬──────────────┤       ││          ││           │          │      │          │ │    query     │       │"  http:   // user:pass @ host.com : 8080   /p/a/t/h  ?  query=string   #hash "│          ││           │          │      │          │ │              │       │└──────────┴┴────���──────┴──────────┴──────┴──────────┴─┴──────────────┴───────┘(all spaces in the "" line should be ignored -- they are purely for formatting)https://www.baidu.com:8080/api.php?from=1000phone&course=nodejs#test{ protocol: 'https:', slashes: true, auth: null, host: 'www.baidu.com:8080', port: '8080', hostname: 'www.baidu.com', hash: '#test', search: '?from=1000phone&course=nodejs', query: { from: '1000phone', course: 'nodejs' }, pathname: '/api.php', path: '/api.php?from=1000phone&course=nodejs', href: 'https://www.baidu.com:8080/api.php?from=1000phone&course=nodejs#test' }执行命令nodeurlurl.parse("https://www.baidu.com")url.parse("https://www.baidu.com:8080/api.php?from=qianfeng&course=node#level")-----query为字符串url.parse("https://www.baidu.com:8080/api.php?from=qianfeng&course=node#level",true)-----query为对象url.parse("https://www.baidu.com",true)url.parse("//www.baidu.com:8080/api.php?from=qianfeng&course=node#level",true)--没有解析到协议和端口号url.parse("//www.baidu.com:8080/api.php?from=qianfeng&course=node#level",true)--解析到host和port将之前的解析出来的使用url.format()执行,可以解析出一个url地址两段url解析成一个url.resolve("http://www.baidu.com","/api/list.php");2、querystring网址:http://nodejs.cn/api/querystring.escape(str)querystring.parse(str[, sep[, eq[, options]]])querystring.stringify(obj[, sep[, eq[, options]]])querystring.unescape(str)nodequerystringquerystring.stringify({name:"qianfeng",course:["nodejs","vue.js"],from:""})querystring.stringify({name:"qianfeng",course:["nodejs","vue.js"],from:""},",")----设置分隔符querystring.stringify({name:"qianfeng",course:["nodejs","vue.js"],from:""},",",":")querystring.parse(默认的字符串)querystring.escape({"from":"beijing"}});querystring.escape("北京")3、http模块4、http小爬虫创建一个文件spider.js网址:https://www.lagou.comvar http = require("http");var https = require("https");var url = "https://www.lagou.com";https.get(url,function(res){var html="";res.on("data",function(data){html+=data;)res.on("end",function(){console.log(html);})res.on("error",function(err){console.log(err);})})引入一个第三方工具cnpm install cheerio --save-dev注意:--save表示安装到本地---项目依赖--dependencies-dev表示安装到开发依赖----devDependencies---项目上线时不需要开发依赖var http = require("http");var https = require("https");var cheerio = require("cheerio");var url = "https://www.lagou.com";function filter(html){var $ = cheerio.load(html);var menu = $(".menu_main");var menuData = [];menu.each(function(index,value){var menuTitle = $(value).find("h2").text();var menuLists = $(value).find("a");var menulist = [];menuLists.each(function(index,value){menulist.push($(value).text())})menuData.push({menuTitle:menuTitle,menulist:menulist})})return menuData}https.get(url,function(res){var html="";res.on("data",function(data){html+=data;)res.on("end",function(){console.log(html);var result = filter(html);printMenu(result);})res.on("error",function(err){console.log(err);})})function printMenu(menu){menu.forEach(function(value){console.log(value.menuTitle+"/n");value.menuList.forEach(function(value){console.log(value);})})}5、request方法新建文件requestGet.js    https://developers.douban.com/wiki/?title=movie_v2#top250请求的数据http://api.douban.com/v2/movie/top250http://json.cn/const https = require('https')var options = { hostname: 'api.douban.com', port: 443, method: 'GET', path: '/v2/movie/top250'}var responseData = ''var request = https.request(options, (response) => { // console.log(response) // console.log(response.statusCode) // console.log(response.headers) 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()新建文件requestPost.jsconst http = require('http')const querystring = require('querystring')var postData = querystring.stringify({ 'question[title]':'这个视频不错2', 'question[content]':'<p>赞一个</p>', 'question[courseId]':'227', 'question[lessonId]':'1753', '_csrf_token':'32b0e1e07c657000e1f7250cdeac0377e6af688f'})var options = { hostname: 'www.codingke.com', port: 80, method: 'POST', path: '/Ajax/create/course/question', headers: {   'Accept':'*/*',   'Accept-Encoding':'gzip, deflate',   'Accept-Language':'zh-CN,zh;q=0.8,en;q=0.6',   'Connection':'keep-alive',   'Content-Length': postData.length,   'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',   'Cookie':'PHPSESSID=qsqkoo0bq1grc6a5jo7kgk5tn7; CNZZDATA1256018185=1839628736-1476447839-null%7C1485424829; Hm_lvt_9f92046de4640f3c08cf26535ffdd93c=1485410187,1485420976; Hm_lpvt_9f92046de4640f3c08cf26535ffdd93c=1485426828',   'Host':'www.codingke.com',   'Origin':'http://www.codingke.com',   'Referer':'http://www.codingke.com/v/398-chapter-227-course',   'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36',   'X-CSRF-Token':'32b0e1e07c657000e1f7250cdeac0377e6af688f',   'X-Requested-With':'xmlHttpRequest' }}var request = http.request(options, (res) => {console.log('Status:' + res.statusCode)console.log('headers:' + JSON.stringify(res.headers))res.setEncoding('utf8')res.on('data', (chunk) => {  console.log(chunk)})res.on('end', () => {  console.log('技术问答提交完毕!')})})request.on('error', (error) => { console.log(error)})request.write(postData)request.end()7、event事件events使用事件:EventEmitter事件的参数只执行一个的事件监听器创建一个文件event_emitter.jsconst EventEmitter = require('events')class Player extends EventEmitter {}var player = new Player()player.once('play', (track) => { console.log(`正在播放:《${track}》`)})player.emit('play', '精绝古城')player.emit('play', '黄皮子坟')8、File System得到文件与目录的信息:stat创建一个目录:mkdir创建文件并写入内容:writeFile,appendFile读取文件的内容:readFile列出目录的东西:readdir重命名目录或文件:rename删除目录与文件:rmdir,unlink创建fs_1.js---查看状态const fs = require('fs')fs.stat('hello.js', (error, stats) =>{ if(error){   console.log(error) } else {   console.log(stats)   console.log(`文件:${stats.isFile()}`)   console.log(`目录:${stats.isDirectory()}`) }})创建fs_2.js---创建目录const fs = require('fs')fs.mkdir('logs', (error) => { if(error){   console.log(error) } else {   console.log('成功创建目录:logs') }})创建fs_3.js---写入文件const fs = require('fs')fs.writeFile('logs/hello.log', '您好 ~ /n', (error) => { if(error) {   console.log(error) } else {   console.log('成功写入文件') }})fs.appendFile('logs/hello.log', 'hello ~ /n', (error) => { if(error) {   console.log(error) } else {   console.log('成功写入文件') }})创建fs_4.js---读取文件const fs = require('fs')fs.readFile('logs/hello.log', 'utf8', (error, data) =>{ if (error) {   console.log(error) } else {   console.log(data) }})创建fs_5.js---读取文件夹const fs = require('fs')fs.readdir('logs', (error, files) => { if (error) {   console.log(error) } else {   console.log(files) }})创建fs_6.js--文件重命名const fs = require('fs')fs.rename('logs/hello.log', 'logs/greeting.log', (error) =>{ if (error) {   console.log(error) } else {   console.log('重命名成功') }})创建fs_7.js--删除目录const fs = require('fs')fs.readdirSync('logs').map((file) => { fs.unlink(`logs/${file}`, (error) => {   if (error) {     console.log(error)   } else {     console.log(`成功的删除了文件: ${file}`)   } })})fs.rmdir('logs', (error) =>{ if (error) {   console.log(error) } else {   console.log('成功的删除了目录:logs') }})9、Stream读取文件流可读流的事件可写的文件流pipe链式使用 pipe创建文件stream.jsconst fs = require('fs')var fileReadStream = fs.createReadStream('data.json')var fileWriteStream = fs.createWriteStream('data-1.json')var count = 0fileReadStream.once('data', (chunk) => {      console.log(chunk.toString())      fileWriteStream.write(chunk)    })fileReadStream.on('data', (chunk) => {   console.log(`${ ++count } 接收到:${chunk.length}`)   fileWriteStream.write(chunk)})fileReadStream.on('end', () => {      console.log('--- 结束 ---')    })fileReadStream.on('error', (error) => {  console.log(error)})流的操作const fs = require('fs')var fileReadStream = fs.createReadStream('data.json')var fileWriteStream = fs.createWriteStream('data-1.json')fileReadStream .pipe(fileWriteStream)进一步处理---写入之前进行压缩const fs = require('fs')const zlib = require('zlib')var fileReadStream = fs.createReadStream('data.json')var fileWriteStream = fs.createWriteStream('data.json.gz')fileWriteStream.on('pipe', (source) => { console.log(source)})fileReadStream .pipe(zlib.createGzip()) .pipe(fileWriteStream)
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表