• Nodejs


    node是运行js的环境

    node 基础命令

    初始化
    // npm init
    // npm init -y// 全部选择yes
    安装包
    // npm install 包名
    // npm i// 安装package-lock.json里面所有的包到node_modules
    // npm i 包名// 安装当前最新版,
    // npm i 包名@版本号//指定版本安装
    // npm i -S 包名// dependencies开发、生产环境通用,默认不加-S
    // npm i -D 包名// devDependencies开发环境专用
    // npm i -g 包名// 全局安装,局部包一般导入使用,全局包一般通过命令使用
    // npm root -g// 查看全局安装路径:C:\Users\admin\AppData\Roaming\npm\node_modules
    删除包
    // npm r 包名// 局部删除
    // npm r -g 包名// 全局删除
    配置npm命令别名
    // 在package.json的scripts中设置:"别名":"node命令",使用npm run 别名 或 npm 别名
    查看配置
    // npm config list
    设置镜像地址
    // npm config set registry https://registry.npm.taobao.org
    使用包
    // require("uniq")引入的是node_modules下的unip模块,该模块下的package.json下配置了main,指向了uniq.js
    let uniq = require("uniq");
    console.log(uniq([1, 2, 2, 3]));// [ 1, 2, 3 ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    模块导入导出

    // 导出
    module.exports = {
        id : 1,
        log : function () {
            console.log(exports === module.exports);
            // false:exports跟module.exports是一个对象,重新赋值变更了module.exports的地址
        }
    }
    module.exports.name = "zhangsan";
    // 导入
    const exp = require("./export.js");
    console.log(exp);
    exp.log();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    文件读写

    // 导入文件模块
    let fs = require("fs");
    // 文件写入
    // {flag:"a"}追加写入,{flag:"w"}清空写入
    // fs.writeFile("./file/file1.txt","666",{flag:"a"},err => {
    //     if (err){
    //         console.log(err);
    //     }else {
    //         console.log("文件写入成功");
    //     }
    // });
    // 追加写入
    fs.appendFile("./file/file1.txt","777",err => {
        if (err){
            console.log(err);
        }else {
            console.log("文件写入成功");
        }
    });
    // 文件读取
    fs.readFile("./file/file2.txt",(err, data) => {
        if (err){
            console.log(err);
        }else {
            console.log(data.toString());
        }
    });
    // 绝对路径
    console.log(__dirname);// 到文件所在目录
    console.log(__filename);// 到文件本身
    // 导入path模块拼接文件路径
    let path = require("path");
    console.log(path.join(__dirname,"file3.txt"));
    console.log(path.resolve(__dirname,"file3.txt"));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    http

    // 导入http模块
    const http = require("http");
    // http://locahost:9000/login?id=1
    const server = http.createServer((req, res) => {
        // 读取请求对象
        console.log(req.method);// GET
        console.log(req.headers.host);// locahost:9000
        const url = new URL(req.url,"http://locahost:9000");
        console.log(url.searchParams.get("id"));// 1
        console.log(url.pathname);// /login
        // 设置响应对象
        res.statusCode = 404;
        res.statusMessage = "msg";
        res.setHeader("content-type","text/html;charset=utf-8");
        res.write("hello");
        res.end("world");// end后不可以在写入
    })
    // 监听端口,启动服务
    server.listen(9000,() => console.log("9000 服务已启动"))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    express框架

    express是一个node.js Web应用框架
    // 导入exoress
    const express = require("express");
    // 创建应用实例
    const app = express();
    // 访问静态资源,默认路径为__dirname + "/public/index.html"
    app.use(express.static(__dirname + "/public"));
    // 实现跨域
    const cors = require("cors");
    app.use(cors());
    // 读取GET请求
    // http://localhost:9000/login?id=1&name=zhangsan
    app.get("/login",(req,res) => {
        console.log(req.path);// /login
        console.log(req.query);// { id: '1', name: 'zhangsan' }
        let {id,name} = req.query;
        console.log(req.query.name);// zhangsan
        console.log(req.get("host"));// localhost:9000
        console.log(req.ip);// ::1 "127.0.0.1"
        // send隐含了res.setHeader('content-type','text/html;charset=utf-8')和res.write();
         res.status(500).set("id","2").send(`express=${req.query.name}`);
        重定向
        // res.redirect("http://www.baidu.com");
        // 响应json字符串
        // res.json({
        //     id : 3,
        //     name : "wangwu"
        // });
        读取文件
        // res.sendFile(__dirname + "/file1.txt");
        下载文件
        // res.download(__filename);
    });
    // restful风格请求:很好的伪装(crud)操作意图
    // http://localhost:9000/login/1/zhangsan
    app.get("/login/:id/:name",(req,res) => {
        console.log(req.params);// { id: '1', name: 'zhangsan' }
        console.log(req.params.name);// zhangsan
        res.end("restful风格请求");
    });
    // 读取POST请求
    app.post('/user',(req,res) => {
       res.send("post新增操作");
    });
    // put请求
    app.put('/user',(req,res) => {
       res.send("put修改操作");
    });
    // delete请求
    app.delete('/user/:1',(req,res) => {
       res.send("delete删除操作");
    });
    // 匹配所有请求方法
    app.all('/user/:1',(req,res) => {
       res.send("all操作任意请求");
    });
    app.all('*',(req,res) => {
       res.send("404 请求地址未找到");
    });
    // 设置并监听端口,启动服务
    app.listen(9000,() => {
        console.log("9000 服务已启动");
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    中间件技术

    const fs = require("fs");
    // 声明中间件
    function 中间件1(){}
    function 中间件2(){}
    // 设置全局中间件,不限个数
    app.use(中间件1,中间件2,(req,res,next) => {
        req.log = "中间件执行";
        fs.appendFileSync("./middleware_log.txt",`${req.path} ${new Date().toLocaleString()}\r\n`);
        next();// 必须放行,才能执行下一个中间件
    });
    // app所有的路由都会执行全局中间件
    app.get("/",(req,res) => {
       console.log(req.log);
    });
    // 路由中间件是局部作用,不限个数
    app.get("/login",中间件1,中间件2,(req,res) => {
       console.log(req.log);
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    路由模块化

    // 创建模块
    const express = require("express");
    const router = express.Router();
    router.get("/user",(req,res) => {
       res.send("user"); 
    });
    module.exports = router;
    // 使用
    const userRouter = require("./router/userRouter");
    app.use(userRouter);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    会话

    // cookie
    const cookie = require("cookie-parser");
    app.use(cookie());
    app.get("/cookie",(req,res) => {
        // 读取cookie
        let {id} = req.cookies;
        // 设置cookie
        res.cookie("id","1",{maxAge: 3 * 1000});
        // 删除cookie
        res.clearCookie("id");
        res.send(`${id}`);
    });
    // session
    const session = require("express-session");
    app.use(session({
        name : "sid",// 设置cookie的name,默认为connect.sid
        secret : 'zhangsan',// 签名:参与加密的字符串
        saveUninitialized : false,// 是否在每次请求设置一个cookie存储session的id
        resave : true,// 是否在每次请求时重新保存session
        cookie : {
            httpOnly : true,// 开启后无法通过js操作
            maxAge: 30 * 1000// 过期时间(毫秒)
        }
    }));
    app.get("/login",(req,res) => {
        // 读取session
        let {name} = req.session;
        // 设置session
        req.session.name = "lisi";
        // 销毁session
        req.session.destroy();
        res.send(`${name}`);
    });
    // token
    const jwt = require("jsonwebtoken");
    const {expressjwt} = require("express-jwt");
    const secretKey = "1@Ab_*";
    // expressjwt({密钥,加密算法}).unless({path[正则表达式](除此以外的路径都要校验token)})
    app.use(expressjwt({secret: secretKey,algorithms: ["HS256"]}).unless({path: [/^\/api\//]}));
    app.get("/api/login",(req,res) => {
        // jwt生成token:签名({data},密钥,{过期时长})
        const token = jwt.sign({name : 'zhangsan'},secretKey,{expiresIn : 30});
        res.send(`${token}`);
    });
    // 在请求头中使用Authorization作为key,Bearer token作为value。才可以访问被拦截的路径
    app.post("/admin",(req,res) => {
        // 获取token里的数据req.auth
        res.send(`${req.auth.name}`);
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    数据库操作

    const mysql = require("mysql");
    // 配置连接
    const db = mysql.createPool({
        host:'127.0.0.1',
        port:'3306',
        user:'root',
        password:'123456',
        database:'test'
    });
    const user = {
        id:1,
        username:'zhangsan',
        password:1234567,
        role:'user'
    };
    // 查询
    let querySql = 'select * from user';
    db.query(querySql,(err,result) => {
        if(err){
            return console.log(err);
        }
        console.log(result);
    });
    // 新增
    let insertSql = 'insert into user(username,password,role) values(?,?,?)';
    db.query(insertSql,['zhaoliu',123456,'user'],(err,result) => {
        if (err) {
            return console.log(err);
        }
        console.log(result);
    });
    // 用对象占位
    let insertSql2 = 'insert into user set ?';
    db.query(insertSql2,user,(err,result) => {
        if (err) {
            return console.log(err);
        }
        console.log(result);
    });
    // 修改
    let updateSql = 'update user set ? where id = ?';
    db.query(updateSql,[user,user.id],(err,result) => {
        if (err) {
            return console.log(err);
        }
        console.log(result);
    });
    // 删除
    let deleteSql = 'delete from user where id = ?';
    db.query(deleteSql,user.id,(err,result) => {
        if (err) {
            return console.log(err);
        }
        console.log(result);
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
  • 相关阅读:
    人工神经网络分析方法,人工神经网络最新应用
    力扣 关于pandas分组聚合的问题
    自定义实现乘风破浪的小船
    突破万字长文输出瓶颈!清华大学开源 LongWriter-6k 数据集;7 个 CCF A 类顶会即将截稿
    【Python大数据笔记_day11_Hadoop进阶之MR和YARN&ZooKeeper】
    20240229金融读报:央行阿拉善创新融资模式与碳排放权交易条例实施,新春政策聚焦新生产力及金融风险防范
    图书推荐:ChatGPT专业知识信息课程
    MySQl(八):索引机制
    JAVA06_Optional类概述、初始化、常用方法、最佳实践
    Java学习 (九)基础篇 包机制&JavaDoc
  • 原文地址:https://blog.csdn.net/h_e_l_l_o_______/article/details/134299366