zoukankan      html  css  js  c++  java
  • node做渲染服务器的实现

    node做渲染服务器的实现

    node 可以进行什么样的开发??

    1.数据服务器 专门书写接口 前后端分离式的开发
    2.渲染服务器 除了书写接口,还要负责页面的返回和渲染, 在 node 中把页面中需要的所有数据直接组装好,返回给前端一个组装好的页面
    3.中间层渲染 作为一个中转服务器,提供页面,逻辑: 前端 <-> node 中间层 <-> 数据服务器

    渲染服务器的分析:

    1.通过url的改变来获取服务器返回的页面,同时发送请求的数据,通过数据,进行数据库对比,进而返回页面
    2.文件夹分类:

    • public 放静态资源: 前端页面需要的静态资源(js, css, image, audio, ...)
    • views 放前端的显示的页面
    • db 放数据库操作
    • app.js 服务器启动文件
    • model 服务器需要用的各种独立封装模块
    • ....

    以一个简单的登录注册来表示

    app.js 服务器启动文件

    const http = require('http')
    const fs = require('fs')
    const urlModel = require('url')
    const { selectUser } = require('./db/db_model')
    
    // 准备一个标识符, 表示是否登陆过
    let userNikename = '';
    http.createServer((req, res) => {
      const { url } = req // => const url = req.url
      if (url.startsWith('/views')) {
        fs.readFile('.' + url, 'utf8', (err, data) => {
          if (err) return console.log(err)
          if (url === '/views/index.html') {
            //   通过userNikename值的变化来改变登录数据的动态变化
            data = data.replace('{{ abc }}', userNikename ? userNikename : '请登录')
          }
          res.end(data)
        })
      }
    
      if (url.startsWith('/public')) {
        fs.readFile('.' + url, (err, data) => {
          if (err) return console.log(err)
    
          res.end(data)
        })
      }
    
      // 判断你是在做登录请求
      if (url === '/login') {
        let str = ''
        // 接收参数
        req.on('data', (chunk) => {
          str += chunk
        })
    
        req.on('end', async () => {
          const { username, password } = urlModel.parse('?' + str, true).query
    
          // 查询数据库
          const result = await selectUser([username, password])
    
          // 根据查询结果, 想前端返回一些数据
          if (result.length) {
            userNikename = result[0].username   //这里实现userNikename值的动态变化
            res.end('{ "message": "登录成功", "code": 1 }')
          } else {
            res.end('{ "message": "登录失败", "code": 0 }')
          }
        })
      }
    }).listen(8080, () => console.log('running at port 8080 ! ^_^'))
    
    

    view下的两个html文件
    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <h1>首页</h1>
        <p>你好 {{abc}}</p>
    </body>
    </html>
    

    login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script src="/public/js/login.js" async defer></script>
    </head>
    <body>
        <form action="">
            用户名: <input type="text" name="username" autocomplete="off"><br>
            密码: <input type="text" name="password" autocomplete="off"><br>
            <button>提交</button>
          </form>
    
    </body>
    </html>
    

    public下的js和css文件
    login.css

    * {
      margin: 0;
      padding: 0;
    }
    
    form {
       500px;
      padding: 30px;
      margin: 100px auto;
      border: 10px solid pink;
    }
    
    form > input {
      margin: 20px 0;
    }
    
    

    login.js

    const form = document.querySelector('form')
    const nameInp = document.querySelector('input[name=username]')
    const pwdInp = document.querySelector('input[name=password]')
    
    form.addEventListener('submit', e => {
      e.preventDefault()
    
      const username = nameInp.value
      const password = pwdInp.value
    
      // 表单验证
    
    
      const xhr = new XMLHttpRequest()
      xhr.open('POST', '/login')
      xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
      xhr.send(`username=${ username }&password=${ password }`)
      xhr.onload = function () {
        const { code } = JSON.parse(xhr.responseText)
    
        if (code === 1) {
          window.location.href = './index.html'     //通过返回的code值来判断是否跳转页面,和node的userNikename相对应
        }
      }
    })
    
  • 相关阅读:
    [转载]iOS 开发中为什么更新UI都要放在主线程中?
    GCD小结
    多线程的实现
    图片缓存、PathForResource、NSBundle
    IOS全路径和文件名方法、NSBundle
    plist文件
    iphone区别翻新机
    iPhone4S国行、港版、美版、妖机识别与选购(转)
    应用沙盒
    IOS实现新特性功能
  • 原文地址:https://www.cnblogs.com/94-Lucky/p/13593809.html
Copyright © 2011-2022 走看看