美文网首页JavaScript系列教程
node学习笔记(四十)

node学习笔记(四十)

作者: 千锋HTML5学院 | 来源:发表于2020-08-06 12:02 被阅读0次

    一、NodeJS如何链接mongodb

    NodeJS中链接Mongodb
    1、安装
    cnpm install mongodb -S
    2、创建链接的地址
    3、链接

    const mongoClient = require("mongodb").MongoClient;
    ​
    //2、创建链接的方式
    const url = "mongodb://127.0.0.1:27017";
    ​
    //3、创建链接的数据库
    const db_name = "gp17";
    ​
    //4、链接
    mongoClient.connect(url,(err,client)=>{
        if(err){
            console.log("链接失败")
        }else{
            console.log("链接成功")
            //5、链接数据库以及表
            var user = client.db(db_name).collection("user");
        }
    })
    

    二、mongoose的基本使用

    1、mongoose与mongodb的区别

    参考上面的

    2、NodeJS链接mongoose

    const mongoose = require('mongoose');
    //是一个构造函数 用来限制表的字段类型
    const Schema = mongoose.Schema;
    //链接的地址
    const url = "mongodb://127.0.0.1:27017/gp17";
    ​
    //链接
    mongoose.connect(url,(err)=>{
        if(err){
            console.log("链接失败");
        }else{
            console.log("链接成功")
        }
    })
    ​
    //链接表/创建表
    var StudentsSchema = new Schema({
        sname:String,
        sage:Number
    })
    //返回值是一个构造函数
    const Students = mongoose.model("student",StudentsSchema);//如果表的名称是复数则 数据库中的表名称不会变 如果不是复数则数据库中标的名称会自动加s
    ​
    // mongoose.model("students",{
    //     sname:String,
    //     sage:Number
    // })
    

    三、用所封装好的路由+nodeJS+Mongoose+MVC实现登录注册

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <link rel="stylesheet" href="./css/index.css">
    </head>
    <body>
        <h1>index页面</h1>
        <div>
            <img src="./img/u=2071817741,4218539796&fm=58&s=EE7A2FC0DE0120D6CF6D1509010070D2.jpg" alt="">
            <img src="./img/u=2708490274,319030395&fm=58&s=9E3269850EF36DB70811A15B03008060.jpg" alt="">
            <img src="./img/u=3473750589,1700978550&fm=58&s=4E946D84D2417CFE5C3FB5D90300D0B9.jpg" alt="">
            <img src="./img/u=3508817781,1654561115&fm=58&s=6D83639716736DB3087070600300E070.jpg" alt="">
        </div>
    ​
        <form id="user">
            用户名: <input type="text" id="username">
            密码: <input type="text" id="password">
            <input type="submit">
        </form>
    </body>
    </html>
    <script src="./js/index.js"></script>
    <script src="https://cdn.bootcss.com/jquery/1.11.3/jquery.js"></script>
    ​
    <script>
        $("#user").on("submit",function (e) { 
            e.preventDefault()
            var username = $("#username").val();
            var password = $("#password").val();
    ​
    ​
            $.ajax({
                url:"/user/register",
                method:"post",
                data:{
                    username,
                    password
                },
                success:function(data){
                    console.log(data);
                }
            })
        })
    ​
    </script>
    
    
    const http = require("http");
    const router = require("./router")
    const server = http.createServer(router)
    ​
    router.post("/user/register",(req,res)=>{
        console.log(req.body);
    ​
       res.json({
           code:200,
           errMsg:''
       })
    })
    ​
    ​
    server.listen(9000)
    ​
    const url = require("url");
    const fs = require("fs");
    const path = require("path");
    const qs = require("querystring")
    //收集事件
    const routerMap = {
        get:{},
        post:{}
    }
    ​
    const router = function(req,res){
        //给res添加一个json方法
        res.json = function(obj){
            res.end(JSON.stringify(obj))
        }
    ​
        //处理静态资源
        handleStatic(req,res);
    ​
    ​
        //获取用户请求的方式
        var method = req.method.toLowerCase();
        //获取用户请求的地址
        var {pathname,query} = url.parse(req.url,true);
    ​
        if(method === "get"){
            if(routerMap.get[pathname]){
                //将query的值赋值给req.query
                req.query = query;
                routerMap.get[pathname](req,res)
            }else{
                res.end("404")
            }
    ​
    ​
        }else if(method === "post"){
            if(routerMap.post[pathname]){
                var str = "";
    ​
                //获取post传递的参数
                req.on("data",(data)=>{
                    str += data;
                })
    ​
                req.on("end",()=>{
                   req.body = qs.parse(str);
                   routerMap.post[pathname](req,res)
                })
                
            }
        }
    }
    ​
    //注册事件
    router.get = function(path,callback){
        routerMap.get[path] = callback;
    }
    //注册事件
    router.post = function(path,callback){
        routerMap.post[path] = callback;
    }
    ​
    ​
    ​
    //处理所有的静态资源访问
    function handleStatic(req,res){
        var {pathname} = url.parse(req.url,true);
        //获取文件的后缀
        var ext = pathname.substring(pathname.lastIndexOf("."));
    ​
        if(pathname ==="/"){
            res.writeHead(200,{"content-type":"text/html;charset=utf8"});
            res.end(getFile(path.join(__dirname,"../public/index.html")))
        }else if(ext === ".css"){
            res.writeHead(200,{"content-type":"text/css;charset=utf8"});
            res.end(getFile(path.join(__dirname,"../public",pathname)));
        }else if(ext === ".js"){
            res.writeHead(200,{"content-type":"application/x-javascript;charset=utf8"});
            res.end(getFile(path.join(__dirname,"../public",pathname)));
    ​
        }else if(/.*\.(jpg|png|gif)/.test(ext)){
            res.writeHead(200,{"content-type":`image/${RegExp.$1};charset=utf8`});
            res.end(getFile(path.join(__dirname,"../public",pathname)));
        }else if(ext === ".html"){
            res.writeHead(200,{"content-type":"text/html;charset=utf8"});
            res.end(getFile(path.join(__dirname,"../public",pathname)));
        }
    }
    ​
    ​
    function getFile(filePath){
        return fs.readFileSync(filePath);
    }
    ​
    module.exports = router;
    

    四、express的基本入门

    1、什么是express?

    Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架,为 Web 和移动应用程序提供一组强大的功能

    2、什么是中间件

    请求和回复之间的一个应用

    3、常见的中间件有哪些?

    1、应用层中间件(http请求之类的应用)

    const express = require("express");
    const app = express();
    ​
    //应用层的中间件
    app.use((req,res,next)=>{
     console.log(123);
     next()
    })
    ​
    app.use((req,res,next)=>{
     console.log(456)
     next()
    })
    ​
    app.use((req,res,next)=>{
     console.log(789);
     next();
    })
    ​
    app.use("/home",(req,res,next)=>{
     res.end("home");
    })
    ​
    app.get("/list",(req,res,next)=>{
     res.end("list")
    })
    ​
    app.post("/list",(req,res,next)=>{
     res.end("list")
    })
    ​
    ​
    app.listen(9000,()=>{
     console.log("server address:127.0.0.1:9000")
    })
    ​
    /*
      express中的中间件会分为哪几类?
          1、应用层中间件(http请求之类的应用)
              app.use app.get app.post
    ​
    ​
          2、内置中间件
          3、错误处理中间件
          4、路由中间件
          5、第三方中间件
          6、自定义中间件
    ​
    ​
      如何使用中间件?
          app.use(中间件) 使用中间件
    ​
       app.use中的参数
          path:选填
          callback || router
    ​
          如果是callback的请求下 这个回调中会有3个参数 
          req:请求
          res:响应
          next:执行下一个中间件
    ​
    ​
      只要http这个服务跑一次那么久会将app.use中的所有函数统一执行一遍
    */
    

    2、内置中间件

    const express = require("express");
    const app = express();
    const path = require("path");
    //内置中间件
    app.use(express.static(path.join(__dirname,"./public")))
    ​
    ​
    app.listen(9000,()=>{
     console.log("server address:127.0.0.1:9000")
    })
    
    

    3、错误处理中间件

    const express = require("express");
    const app = express();
    const path = require("path");
    //内置中间件
    app.use(express.static(path.join(__dirname,"./public")))
    ​
    ​
    ​
    //错误中间件处理一般写在程序的最后面
    app.use((req,res,next)=>{
     res.status(404).send("没有这个页面")
    })
    ​
    app.listen(9000,()=>{
     console.log("server address:127.0.0.1:9000")
    })
    

    4、路由中间件

     const express = require("express");
    const app = express();
    const path = require("path");
    const indexRouter = require("./router/index");
    ​
    //内置中间件
    app.use(express.static(path.join(__dirname,"./public")))
    ​
    //路由级别的中间件
    app.use("/user",indexRouter)
    ​
    app.listen(9000,()=>{
     console.log("server address:127.0.0.1:9000")
    })
    

    5、第三方中间件
    例如 cheerio jsonwebToken等

    6、自定义中间件
    自己根据需求封装的中间件

    相关文章

      网友评论

        本文标题:node学习笔记(四十)

        本文链接:https://www.haomeiwen.com/subject/uyjzrktx.html