# node-study **Repository Path**: h5-study/node-study ## Basic Information - **Project Name**: node-study - **Description**: 学习node.js - **Primary Language**: NodeJS - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-05-14 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### Node.js学习 ### 1. day01 **1.1 搭建最简单的http服务器** ``` // 1.加载 http 核心模块 var http = require('http') // 2.使用 http.createServer() 方法创建一个 web 服务器 var server = http.createServer() // 3.当客户端请求过来,就会自动触发服务器的request请求事件,然后执行第二个参数:回调处理 server.on('request',function(){ console.log('收到客户端的请求') }) // 4.绑定端口号,启动服务器 server.listen(3000,function(){ console.log('服务器启动成功了') }) ``` **1.2 搭建最简单完整的http服务器** ``` // 1.加载 http 核心模块 var http = require('http') // 2.使用 http.createServer() 方法创建一个 web 服务器 var server = http.createServer() // 3.当客户端请求过来,就会自动触发服务器的request请求事件,然后执行第二个参数:回调处理 // request 请求事件处理函数,需要接收两个参数 /* request 请求对象 请求对象可以用来获取客户端的一些请求信息,例如请求路径 response 响应对象 响应对象可以用来给客户端发送响应消息 */ server.on('request',function(request,response){ console.log('收到客户端的请求') response.write('hello word') response.end() }) // 4.绑定端口号,启动服务器 server.listen(3000,function(){ console.log('服务器启动成功了') }) ``` **1.3 根据不同的请求路径发送不同的响应结果Router** 路由: 前端:根据不同的url显示不同的视图 路由: 后端:根据不同的url---path 显示不同的数据 写接口的 **例1:** ``` var http = require('http') ar server = http.createServer() server.on('request',function(req,res){ // 根据不同的请求路径发送不同的响应结果 // 1.获取请求路径 // req.url 获取到的是端口号之后的那一部分路径 // 也就是说所有的url都是以 / 开头的 // 2. 判断路径处理响应 // 解决中文乱码问题 res.setHeader('Content-Type','text/plain;charset=utf-8') var url = req.url if(url === '/products'){ var products = [ { name:'苹果 X', price:8888 }, { name:'萝卜 X', price:7777 }, { name:'香蕉 X', price:6666 } ] // 响应对象只能是二进制数据或者字符串 // 数字 对象 数组 布尔值 都不行 res.end(JSON.stringify(products)) }else if(url === '/login'){ res.end('login page') }else{ res.end('404 Not Found.') } }) // 4.绑定端口号,启动服务器 server.listen(3000,function(){ console.log('服务器启动成功了') }) ``` **例2:** ``` var http = require('http') var url = require('url') var obj = require('./commom') http.createServer((req,res)=>{ res.writeHead(200,{'content-type':'text/html;charset=utf-8'}) if(req.url != '/favicon.ico'){ // 取路径,去掉斜杠 var path = url.parse(req.url).pathname.replace(/\//,'') try { obj[path](req,res) } catch (error) { obj['home'](req,res) } } }).listen(3000) ``` **1.4 简单的模块化** **在a.js中** ``` /* 1、require 是一个方法 它的作用就是用来加载模块的 在node中,模块有三种: 具名的核心模块,例如 fs、http 用户自己编写的文件模块 相对路径必须加 ./ 可以省略后缀名 在node中,没有全局作用域,只有模块作用域 外部访问不到内部------内部也访问不到外部 既然是模块作用域,那么如何让模块与模块之间进行通信(默认都是封闭的) 2、require方法有两个作用: 2.1、加载文件模块并执行里面的代码 2.2、拿到被加载文件模块导出的接口对象 在每个文件模块都提供一个对象:exports */ var str = require('./b') // require('./b.js') onsole.log(str.foo) ``` **在b.js中** ``` var foo = 'bbb' exports.foo = foo ``` **1.5 读取文件中的数据,html,img** ``` var http = require('http') var fs = require('fs') var server = http.createServer() server.on("request",(req,res)=>{ fs.readFile('./index.html',function(err,data){ console.log(JSON.stringify(data)) if(err){ res.setHeader('Content-Type','text/plain;charset=utf-8') res.end('文件读取失败,请稍后重试') }else{ res.setHeader('Content-Type','text/html;charset=utf-8') res.end(data) } }) }) server.listen(3000,function() { console.log('服务器启动了') }) ``` **1.6 代理请求豆瓣接口** ``` var https = require('https') // 创建一个属于自己的代理服务器 var http = require('http') // 请求豆瓣接口 // https端口号是443,http是80 const options = { hostname:'api.douban.com', post:443, path:"/v2/book/isbn/9787010009230?apikey=0df993c66c0c636e29ecbb5344252a4a", method:'GET' } var str = '' var str1= '' const req = https.request(options,(res)=>{ // data是对数据进行接受 res.on('data',(d)=>{ str += d }) // end是对数据进行处理 res.on('end',(d)=>{ str1 = str }) }) req.on('error',(e)=>{ console.error(e) }) req.end() http.createServer((req,res)=>{ res.writeHead(200,{'content-type':'text/html;charset=utf-8'}) if(req.url != '/favicon.ico'){ res.write(str1) res.end() } }).listen(3000) ``` ### 2. day02---- MongoDb学习 **2.1 启动mongodb** 先启动bin文件夹下的mongod.exe,在启动mongo.exe,再在对应的文件夹下启动cmd,输入mongo连接服务器。 ``` **mongo的基础指令** show dbs 获取你当前所有的数据库 use dataBase_name 创建数据库(没有-创建/存在-使用) db 指查询你当前的数据库 db.stats() 查询你当前数据库的状态 db.dropDatabase() 删除你当前的数据库 db.help() 查询帮助 db.version() 获取你当前数据库的版本 db.database_name.help() 查询任意数据库的帮助 db.collection_name.find() 查询你当前集合内的信息 ``` ``` 需要写入一个文档集合album insert插入 db.album.insertOne({‘title’:’xxxx’}) 查看采用 db.album.find(); 插入多条数据insertMany( [{},{},{}] ) ``` **2.2 连接mongodb数据库** ``` var mongodb = require('mongodb') var http = require('http') var url = "mongodb://localhost:27017"; // 创建服务对象 // {auto_reconnect:true}是否掉线重新连接 var server = new mongodb.Server('localhost',27017,{auto_reconnect:true}) // 创建数据库对象 // {safe:true} 是否创建一个安全的数据对象 var db = new mongodb.Db('namelist',server,{safe:true}) // 连接 // db.open() 打开数据库 http.createServer((req,res)=>{ res.writeHead(200,{'content-type':'text/html;charset=utf-8'}) if(req.url != '/favicon.ico'){ db.open((err,database)=>{ // database.collection 数据的集合,在集合里面找到user database.collection('user',(err,coll)=>{ // 把 user 集合里面所有的数据转换成数组 coll.find({}).toArray((err,data)=>{ res.write(JSON.stringify(data)) // 关闭数据库 database.close() res.end() }) }) }) } }).listen(3000) ``` **2.3 mongodb执行增删改功能** ``` var mongodb = require('mongodb') var http = require('http') var server = new mongodb.Server('localhost',27017,{auto_reconnect:true}) var db = new mongodb.Db('namelist',server,{safe:true}) var obj = {name:'add数据库',age:20} db.open((err,database)=>{ database.collection('user',(err,coll)=>{ // 增加 // coll.insertOne(obj,()=>{ // database.close() // }) // 删除 // coll.deleteOne(obj,()=>{ // database.close() // }) // 改 // coll.update({'add':1111},{$set:{add:'哈哈'}},()=>{ // database.close() // }) }) }) ``` ### 3. day03 **3.1 Express学习** ``` 安装npm i nodemon -g 热更新,使用的时候把node 改成nodemon 或安装npm i supervisor -g 热更新,使用的时候把node 改成supervisor 全局安装 Npm i express express-generator -g 脚手架创建项目 express 项目名字 进入目录,npm i 安装依赖 ``` 简单使用,新建一个文件夹,npm i express,并创建一个 .js 文件 **3.1.1应用级别路由** ``` // 0、安装 // 1、引包 var express = require('express') // 2、创建你服务器的应用程序 // 也就是原来的 http.createServer var app = express() // 在Express中开放资源就是一个API的事 // 公开指定目录 // 只要这样做了,你就可以直接通过 /public/xx 的方式访问public目录中的所有资源了 app.use('/public/',express.static('./public/')) // 当服务器收到get请求 / 的时候,执行回调处理函数 app.get('/',function(req,res){ res.send('hello express') }) app.get('/about',function(req,res){ res.send('你好,我是 Express') }) // 相当于server.listen app.listen(3000,function(){ console.log('服务器请求完成') }) ``` **3.1.2路由级别路由(常用)** ``` var express = require('express') var app = express() // 路由对象 var router = new express.Router() router.get('/',(req,res)=>{ res.send('hello') }) router.get('/home',(req,res)=>{ res.send('home') }) app.use('/',router) app.listen(3000) ``` **3.2 脚手架创建项目** ``` express -e myname(项目名字) 安装依赖 npm i 启动项目 npm satrt 自定义启动项目,在page.json里面设置 "scripts": { "start": "node ./bin/www", "dev": "nodemon ./bin/www" }, ```