node的下载和安装步骤
国内下载地址:
https://nodejs.org/download/release/ (选msi后缀的下载,双数的问题)
win更新node版本步骤:
1、查看现在的版本和安装的位置,新版的node要与旧的安装位置一样
2、安装新版的node,选择旧的安装地址,一路next则ok
详细的node接口、链接数据库封装:如何使用nodejs写一个接口 - 知乎
node安装和配置环境变量步骤:
如是需要更换版本提示Later version of Node.js is already installed. Setup will now exit,找到原版本的exe,双击再安装再选择remove卸载即可
一、什么是nodejs
电脑是不能识别js语言的,需要通过node的转化才能识别,而node是基于chrome v8环境
二、运行
运行环境下: node xxxx.js
四、模块化
模块即是文件
导出:
moudle export = {test,test2}
引入:
let mytest = require('./stuff')
mytest.test()
五、event事件
eventEmitter是node的内置模块,注册事件都需要用到
//映入
var events = require('events')
//实例化
var myEmitter = new events.EventEmitter()
//注册事件
myEmitter.on('test',function(msg){
setImmediate(function(){
console.log(msg) //你好啊
})
})
//事件调用
myEmitter.emit('test',"你好啊")
六、文件读取(fs模块)
//映入fs模块
var fs = require('fs')
fs.readFile("路径",utf8,function(){
console.log('已读取完')
}) //异步读取
fs.writeFile("文件路径",data) //写入文件
七、创建本地服务器(http模块 )
//引入
var http = require('http')
//创建一个服务器
var server = http.createServer(function(req,res){
res.writeHead(200,{'Content-type':'text/plain'})
res.end("创建了一个服务器") //返回给浏览器一个文本来显示
})
//监听服务器地址和端口
server.listen(8888,'127.0.0.1')
八、文件流
stream、pipe(管道)
path模块:操作路径,获取当前路径、合并字符串为路径、获取扩展名等
let pateh_ = require(path)
os模块:获取系统的信息,如cpu、系统类型等
九、安装插件时,先创建packge.json文件
1、执行npm init //全部直接回车
2、npm install xxx--save
十、工具nodemon
启动工具,每次改变自动重启服务
安装(全局):cnpm install -g nodemon --save-dev
使用:nodemon xxx
十一、express
基于node的轻量级、高效的web框架
安装: npm install express
//简易型服务模板
var express = require('express')
var myController = require('./controller/mycontroller')
var app = express()
app.set('view engine','ejs')
app.use(express.static('./public'))
myController(app)
app.listen(3000)
--------------------------------------------
//cnpm install -g express 安装
express在4.0后把命令工具单独分了出来,安装完express后,还得安装express-generator
//npm install express-generator -g
法一:
在指定目录下
express myapp //创建项目
cd myapp
cnpm install
cnpm start //启动 或: nodemon ./bin/www
localhost:3000 //浏览器访问
法二:
--------------------------------------------
express -e myapp //-e全称为 --view=ejs ,myapp是要创建项目的名称
cd myapp
npm install
npm start
app.js文件下:
app.get("/test",async (req,res)=>{
let str = "select * from user limit 0,2"
let res_ =await mysqlQuery(str)
console.log(res_)
res.send(Array.from(res_)) //响应为json
})
十二、创建node项目步骤、快速搭建一个简单的api服务
1、新建一个文件夹toapp,并用终端打开此文件夹
2、npm init //创建packge.json文件
3、cnpm install express --save-dev //安装express框架
4/cnpm install ejs body-parser --save-dev //安装对ejs的模板引擎,body-parser对数据的解释
在toapp文件下新建index.js:
const express = require('express')
const app = express()
app.use((request,response,next)=>{
console.log('有人请求了');
next()
})
app.get('/students',(request,response)=>{
const students = [
{id:'1',name:'小明',age:18}
]
response.send(students)
})
app.listen('5000',(err)=>{
if(!err) console.log('连接成功啊!');
})
启动命令:
node index.js
访问会返回students数据json:
http://localhost:5000/students
常用node插件
npm i -S body-parser //回去传过来的参数
npm i -S cors //处理跨域
npm install -g nodemon --save-dev //自动重启
npm i -S express-validator //快速验证是否符合某种格式,如是否是邮箱
npm i -S jsonwebtoken //生成jwt token
十三:css
.buttons button:last-of-type:before{ //最后一个button
}
十四、爬虫
先安装 cnpm install cheerio //类似于jq
在pachong.js中:
//1、引入heep对象
const http = require('http')
//发送请求
http.get('http://bbs.itheima.com/forum-401-1.html',function(req,res){
//获取html数据
var html=''
req.on('data',function(data){
html+=data
})
req.on('end',function(data){
getTitle(html)
})
})
function getTitle(html){
//引入模块
const cheerio = require('cheerio')
const $ = cheerio.load(html,{decodeEntities:false})
$(".xst").each(function(index,item){
console.log($(item).html())
})
}
运行:node pachong.js
//方法二、模拟打开浏览器来爬虫
安装puppeteer
let puppeteer = require('puppeteer')
async function test(){
//实例化浏览器
let browser = await puppeteer.launch({headless:false})
//打开页面
let page = await browser.newPage()
//打开指定的网址
await page.goto('https://www.1905.com/')
//截图
await page.screenshot({path:'screen.png'})
//查找元素
page.$$eval('.head-bar li a',(element)=>{
console.log(element)
element.forEach((item,i)=>{
console.log(item.innerHTML) //会在打开的控制台输出
})
})
}
test()
十五、创建koa项目
1、创建空文件夹在此路径下 cnpm i
2、安装koa和koa-router : cnpm install koa koa-router --save
15.1、用koa搭建服务
//引入模块
const Koa = require("koa")
const Router = require("koa-router")
//实例化
const app = new Koa()
const router = new Router()
//配置路由
app.use(router.routes()).use(router.allowedMethods())
//路由
router.get("/",async ctx=>{
ctx.body = {msg:"你好 koa"}
})
//设置端口
const port = process.env.PORT||5000;
//监听服务
app.listen(port,()=>{
console.log(`开启了服务:${port}`)
})
十六、安装mongoose
在线mongoosdb:https://cloud.mongodb.com
1、cnpm install mongoose --save
app.js中
const mongoose = require("mongoose")
//链接数据库
mongoose.connect('mongodb+srv://test:test1234@cluster0-up08u.mongodb.net/test?retryWrites=true&w=majority',{ useNewUrlParser: true })
.then(()=>{
console.log("连接数据库成功")
})
.catch(err=>{
console.log("连接失败",err)
})
十七、
安装:获取前端以参数传过来的东西
cnpm i koa-bodyparser --save
引入
const bodyParser = require('koa-bodyparser')
使用
app.use(bodyParser());
十八、加密后存到数据库
1、安装
cnpm install bcryptjs --save
引入:
const bcrypt = require('bcryptjs');
//加密,给newUser中的password加密
await bcrypt.genSalt(10, (err, salt) =>{
bcrypt.hash(newUser.password, salt,(err, hash)=> {
console.log(hash)
if(err) throw err;
newUser.password = hash
});
});
//传字符串、加盐md5加密
function jiami(str){
let salt = 'dgfdsgfdsfdbsfbfdsad'
let obj = crypto.createHash('md5')
str = str+salt
obj.update(str)
return obj.digest('hex')
}
十九、注册
const Router = require('koa-router')
const router = new Router()
const bcrypt = require('bcryptjs');
const User = require("../../model/Users")
//测试接口/路由
router.get("/test",async ctx=>{
ctx.status = 200
ctx.body={msg:"这是test页面。。。"}
})
//注册路由
router.post('/register',async ctx=>{
console.log(ctx.request.body)
//查数据数据库中是否存在
const findResult =await User.find({email:ctx.request.body.email})
if(findResult.length>0){ //数据库中已经存在
ctx.status = 500
ctx.body={email:'邮箱已经被占用'}
}else{
const newUser = new User({
name:ctx.request.body.name,
password:ctx.request.body.password,
email:ctx.request.body.email
})
//加密
await bcrypt.genSalt(10, (err, salt) =>{
bcrypt.hash(newUser.password, salt,(err, hash)=> {
console.log(hash)
if(err) throw err;
newUser.password = hash
});
});
//存到数据库
await newUser.save().then(user=>{
ctx.body = user
})
.catch(err=>{
console.log(err)
})
ctx.body = newUser
}
})
module.exports = router.routes()
二十、登录生成token
生成token插件:jsonwebtoken
安装:cnpm i jsonwebtoken
引入:const jwt = require("jsonwebtoken")
router.post('/login',async ctx =>{
//查询
const findRsult = await User.find({email:ctx.request.body.email})
if(findRsult.length==0){
ctx.status=404
ctx.body={email:'用户不存在!'}
}else{
var result = bcrypt.compareSync(ctx.request.body.password, findRsult[0].password);
if(result){
//返回token
const payload = {id:findRsult[0].id ,name:findRsult[0].name,avatar:findRsult[0].avater}
const token = jwt.sign(payload,keykenkey.keykenkey,{expiresIn:3600})
ctx.status=200
ctx.body={success:"登录成功",token:"Bearer "+token}
}else{
ctx.status=400
ctx.body={password:'密码错误'}
}
}
})
npm命令:
npm install 包名 --save-dev (-d) //下载到开发环境
npm install 包名 --save (-s) //下载到生产环境
-g //全局安装
npm list //查看安装了什么
npm --help //查看命令行
npm update 包名 //更新某个包
npm uninstall 包名 //卸载
上传自己封装方法的js文件到npm库
1、npm官网注册账号和绑定邮箱(密码要记住)
2、命令行进入封装方法的js文件夹
一次输入以下命令:
npm init //填写信息,会生成pajson.json文件
npm login //输入账号密码邮箱
npm publish //上传
npm xxx //npm init时输入的name 就会下载下来
数据库查询语句
//查询所有从score表,关联student表且score.id = student.id
select * from score INNER JOIN student on score.id = student.id
where student.name in (select * from student where age<20)
视图:查询语句的衍生出的表,具有表结构,可以像查表一样
事务:
事务:中间有出错,怎个操作都会失效
begin; //开启事务
xxxx //数据库操作语句
xxx
xxx
COMMIT; //提交
使用mysql
//安装 cnpm install mysql --save
//使用
let mysql = require("mysql")
let options ={
host:"localhost",
user:"jhlproject",
password:"123456",
database:"jhlproject"
}
let con = mysql.createConnection(options)
con.connect(err=>{
if(err){
}else{
console.log("数据库连接成功")
}
})
function sqlQuery(strsql,arr){
return new Promise((resolve,reject)=>{
con.query(strsql,arr,(err,results)=>{
if(err){
reject()
}else{
resolve(results)
}
})
})
}
module.exports = sqlQuery
get和post
app.js中:
app.set("views","views") //设置视图目录在views下
app.set("view engine","ejs") //设置模板引擎
app.engine("ejs",ejs.__express) //定义模板引擎
app.use(express.urlencoded({ extended: true })); //post需要加入
app.get("/login",(req,res)=>{ //浏览器进入login时,返回login.ejs页面
res.render("login.ejs")
})
app.post("/login",(req,res)=>{ //form提交是post,req.body拿到参数,get则是req.query拿
console.log(req.body)
// res.join(Array.from(result))
res.send("登录成功")
})
中间件
router下新建api.js(引入express):
let api = express.router
处理跨域中间件:
api.use((req,res,next)=>{
res.append("Access-Control-Allow-Origin","*")
res.append("Access-Control-Allow-Content-Type","*")
next() //允许执行下一步
})
api.get("/list",(req,res)=>{
res.send("这是/book下的/list")
})
moudle.export = api
app.js中:
import api = require("../router/api.js")
app.use("/book",api)
cookie
app.js中:
let cookieParser = require('cookie-parser')
app.use(cookieParser()) //cookie的中间件
中间件中
cookierouter.get("/cookieurl",(req,res)=>{
console.log(req.cookies.login)//获取传过来的cookie
res.cookie("login","true",{maxAge:10*1000,httpOnly:true})
res.send("设置cookie完成")
})
// 控制台输入document.cookie可看到cookie,设置httponly则关闭
//maxAge 设置多少毫秒后失效
session
安装:cnpm install express-session
let session = require('express-session')
app.use(session({
secret:"ddsfdsf", //随机字符
resave:false, //强制保存
saveUninitialized:true, //是否保存初始化值
cookie:('name','value',{maxAge:5*10*1000})
}))
//用到post时
app.use(express.urlencoded({ extended: true }));
app.get("./login",(req,res)=>{
req.session.username="小明" //设置session
if(req.session.username="小明"){ //从cookie中取
}
})
上传文件
安装:cnpm install multer --save
app.js中引入,并use它的中间件
app.use("/uploap",upload.single("myfile"),(req,res,next)=>{
console.log(req.file) //获得上传的信息
})
下载
res.download("地址") //地址是./public/....
完整返回json数据的api例子:
router.get('/api/userlist',async (req,res,next)=>{
let page = parseInt(req.query.page) || 1
let limtnum = parseInt(req.query.limit) || 10
let str = 'select * from userinfo limit ?,?'
let result = await strmysql(str,[page,limtnum])
let option ={
"code": 0,
"msg": "",
"count": 1000,
"data":Array.from(result)
}
res.json(option)
})
或者:
res.status(200).json({xx:xx})
//发送get请求即可