【NodeJS】服务器搭建

Node服务器搭建

一. 静态服务器搭建

  • 先说一下端口:比如一台电脑上可以部署多个服务器,通过本地回环地址(127.0.0.1/localhost)可以找到电脑,然后通过端口区分不同的服务器。

    • 默认的http端口是80,Apache配置web服务器用的就是默认的80端口。默认的80端口可以省略

    • 我们搭建服务器不要去占用公认端口(0~1023),用大于这个范围的端口一般没有被占用。

      当然大于这个范围也有被占用的端口,例如:

      3306端口:MYSQL数据库端口
      5432端口:postgresql数据库端口
      6379端口:Redis数据库端口
      8080端口:TCP服务端默认端口
      8888端口:Nginx服务器的端口
      9200端口:Elasticsearch服务器端口
      27017端口:mongoDB数据库默认端口
      22122端口:fastdfs服务器默认端口

  • 搭建一个简单的服务器,返回html页面

  • 返回页面,请求那个页面返回那个页面

    执行过程:

    1. 首先游览器发送请求到服务器
    2. 服务器从游览器的请求中获取要的是哪一个资源,然后在服务器的资源中查找有没有所要的资源
    3. 如果有则返回那个资源给游览器,没有则返回404页面
    // 创建服务器
    const sever = http.createServer((request, response)=>{
        // 设置返回给用户的内容
    	// console.log(request); // 请求内容
        // console.log(request.url); // url包含请求的资源名字
        
        // 拼接要读取的文件路径
        const filePath = path.join(__dirname,'web',request.url);
    })
    

    这里的request就是请求内容,request里的url包含请求的资源名字

    用request.url来拼接路径就可以得到要读取的资源路径

  • 静态资源服务器完整代码:

    // 导入模块
    const path = require('path');
    const http = require('http');
    const fs = require('fs');
    
    // 创建服务器
    const sever = http.createServer((request, response)=>{
        // 设置返回给用户的内容
    
        // 1. 获取用户请求的是那个页面
        const filePath = path.join(__dirname,'web',request.url);
    
        // 2.读取文件的内容
        fs.readFile(filePath,(err,data)=>{
            if(err == null){
                response.end(data);
            }else{
                response.end('404 not found' + err)
            }
        })
    })
    
    // 开启服务器
    sever.listen(8088,()=>{
        console.log('8088服务器开启了...')
    })
    

    这里的fs.readFile()里不要加‘utf-8’。如果加了会导致无法识别别的类型文件

    • 服务器有一个嗅探功能:会根据请求的资源名字,自动获取要请求什么类型的资源类型
  • 美化404页面

    • 可以准备一个404页面然后response.end返回

    • 也可以直接用模板字符串

      const path = require('path');
      const http = require('http');
      const fs = require('fs');
      
      // 创建服务器
      const sever = http.createServer((request, response)=>{
          // 设置返回给用户的内容
      
          // 1. 获取用户请求的是那个页面
          const filePath = path.join(__dirname,'web',request.url);
      
          // 2.读取文件的内容
          fs.readFile(filePath,(err,data)=>{
              if(err == null){
                  response.end(data);
              }else{
                  response.end(`
                      
                      
                      
                          
                          
                          Not Found
                      
                      
                          

      404 Not Found

      ${err}

      `
      ) } }) }) // 开启服务器 sever.listen(8088,()=>{ console.log('8088服务器开启了...') })
  • 服务器补充

    • 页面上所有的外部资源(图片,css文件,js文件)都要向服务器发送请求来获取

    • 所以为了节省加载时间,如果有多个图片最好能整合成一张精灵图

    • 会自动请求一个favicon.ico,这是标签页的图标

    • 后端路由:就是写接口

      // 导包
      const express = require('express');
      const bodyParser = require('body-parser');
      var multer = require('multer');
      
      // 创建服务器
      const app = express()
      
      // 用包创建一个uploads文件夹
      var upload = multer({ dest: 'uploads/' })
      
      // 转换格式
      app.use(bodyParser.urlencoded({ extended: false }))
      
      // 注册接口
      app.post('/register', (req, res) => {
          // 注册相关逻辑
          res.send('测试post接口');
      })
      
      // 登录接口
      app.post('/login', (req, res) => {
          // 注册相关逻辑
          res.send('测试post接口');
      })
      
      // 获取所有英雄接口
      app.get('/getAllHero', (req, res) => {
          // 获取所有英雄
          res.send('测试post接口');
      })
      
      // 删除英雄接口
      app.get('/deleteHero', (req, res) => {
          // 获取所有英雄
          res.send('测试post接口');
      })
      
      // 开启服务器
      app.listen(8080, () => {
          console.log('服务器已开启')
      })
      

二. 参数传递get和post

  • get和post的区别

    1. get传值是通过url传值,而post是通过请求体传递的(guerystring)
    2. get传递的数据相对较小,而post传递的数据相对而言比较大
    3. get传值由于是在url中传递的,所以安全性较低.
      post传值安全性相对而言高- -点
    4. get-般用于请求数据/获取数据
      post-般用于提交数据
  • get:数据拼接在URL上面

    http://127.0.0.1:8089/?id=123456&&password=10086

    • 可以用require.url拿到,但要处理字符串

       // 导入模块 
      const http = require('http');
      const url = require('url');
      
      const sercer = http.createServer((require,Response)=>{
         let urlObj = url.parse(require.url,true);
          
         Response.end(JSON.stringify(urlObj.query)); 
         // {"id":"123456","password":"10086"}
      })
      
      sercer.listen(8089,()=>{
           console.log('8089服务器开启了')
      })
      

      可以使用url模块调用pars方法来处理字符串

      • 第一个参数: 要处理的url
      • 第二个参数: 如果为true则返回一个对象

      会返回一个url对象,里面有query

      query: [Object: null prototype] { id: ‘123456’, password: ‘10086’ }

  • post:数据不是拼接在url上, 存在请求体中

    • 传给后端不会一下传过去,会把数据分成很多块,一小块一小块的传

      如果要接收,

      1. 首先要有一个容器
      2. 然后给require一个data事件(执行很多次),把这些小块数据拼起来
      3. 给require一个end事件(只执行一次),表示数据传递完了
      4. 处理数据 queryString.parse()
      // 导入模块
      const http = require('http');
      const queryString = require('querystring');
      
      // 创建服务器
      const server = http.createServer((request, response) => {
          // 创建一个容器
          let postData = '';
          
          // 然后给require一个data事件
          request.on('data',(chunk)=>{
              postData += chunk
          })
          
          // 给require一个end事件
          request.on('end',()=>{
              console.log(postData);
              // 用queryString.parse()处理数据
              let postObj = queryString.parse(postData);
              console.log(postObj);
          })
          
          response.end('测试')
      })
      
      // 开启服务器
      server.listen(8088, () => {
          console.log('服务器开启了:8088')
      })
      

你可能感兴趣的:(NodeJS)