美文网首页
Node.js_后端路由(二)

Node.js_后端路由(二)

作者: learninginto | 来源:发表于2020-03-04 00:43 被阅读0次

    Node.js_后端路由(二)

    接着上一篇Node.js_后端路由(一)进行改进优化,有困惑之处可以回头查漏补缺。

    • 通过routerMap收集事件

      const routerMap = {
          get:{},
          post:{}
      }
      
    • router.get/router.post注册事件

      • index.js

        一旦页面中的URL地址发生改变,就会触发createServer()函数。

        注册事件包含两个参数,第一个参数是path路径,第二个参数是回调函数。

        const http = require("http");
        const router = require("./router")
        const server = http.createServer(router)
        
        router.post("/user/register", (req, res) => {
            res.json({
                code: 200,
                errMsg: ''
            })
        })
        
        server.listen(9000)
        

        通过上面的router.post将事件注册到routerMap中。

      router.get = function(path,callback){
          routerMap.get[path] = callback;
      }
      router.post = function(path,callback){
          routerMap.post[path] = callback;
      }
      
    • router.js

      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))
          }
      
          //处理静态资源,在上一篇文章Node.js_后端路由(一)中提到
          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);
          //获取文件的后缀,使用lastIndexOf找最后的“.”更为严谨
          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;
      
      
    • 将简易版的路由发布到npm网站中

      • 在终端登录npm
      1. npm login

      2. 输入用户名

      3. 输入密码,10位以上(注意:密码不可见,全凭感觉)

      4. 输入邮箱(会提示登录成功)

      5. 查看当前镜像源:nrm ls

      6. 确保使用的是npm镜像源:nrm use npm

      7. 上传所有npm publish .

      8. 下载时安装router-lxc

      下载.png

    相关文章

      网友评论

          本文标题:Node.js_后端路由(二)

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