从0开始使用node.js搭建本地服务器

804 阅读6分钟

1.1-什么是nodejs

  • 1.Node.js官网地址:nodejs.org/en/

  • 中文:nodejs.cn/api/

  • 1.Node.js 是一个构建于 Chrome V8引擎之上的一个Javascript 运行环境

    • Node一个运行环境,作用是让js拥有开发服务端的功能
  • 2.nodejs的作用 : 使用js语言开发服务器

image.png

1.3-Node.js环境安装

如何确认当前电脑是否已经安装了Node环境

  • 打开终端,输入 node -v,如果能看到版本号则说明当前电脑已经安装Node环境,如果提示Node不是内部或外部命令,则表示未安装

    • 一旦安装了node,则会自动一并安装npm

image.png

==1.4-如何运行Node.js程序==

image.png

1.5-服务端js与客户端js区别

  • 1.客户端JS由三部分组成

    • ECMAScript:确定js的语法规范
    • DOM:js操作网页内容
    • BOM:js操作浏览器窗口
  • 2.服务端JS只有ECMAScript

    • 因为服务端是没有界面的

      • ==在nodejs中使用dom与bom的api程序会报错==

1.6-nodejs模块化介绍

  • 1.什么叫模块化?(模块 === js文件)

    • 模块化就是把一个大的文件拆分成很多个小文件,用特定的语法将各个文件(模块)组合到一起
    • 一个js文件可以引入另一个文件, 这种开发方式就叫做模块化开发
  • 2.模块化开发好处?

    • (1)将功能分离出来

      • 一个js文件只负责处理一个功能,这样做的好处是业务逻辑清晰,便于维护
    • (2)按需导入

      • 用到哪一个功能,就导入哪一个js文件。模块化开发是渐进式框架的共同特征。
    • (3)避免变量污染

      • 一个js文件(模块),都是一个独立的作用域。 互不干扰,不用考虑变量名冲突问题。
  • 1.nodejs是一个渐进式框架, 我们后面要学习的vue框架也是渐进式框架

  • 2.什么是渐进式框架呢 : 一个功能对应一个模块(js文件), 需要用的时候导入即可

    • 说人话:

      • 非渐进式框架 : 套餐, 一次性导入所有的功能。 无论是的项目用还是不用(浪费资源)
      • 渐进式框架 : 自助餐。 吃什么用什么,不浪费。(节省资源)

1.7-Common模块化语法规范

  • 任何一个语法,都需要遵循一定的规范。不同的平台需要遵循的规范不同。一般情况下,模块化语法规范主要有三种。

  • CommonJS 规范:nodejs 默认支持的

  • ES6规范:前端的ES6语法支持的规范

  • CMD 和 AMD 模块化规范 : ES6语法之前的模块化语法规范,现在已经几乎不用了

  • CommonJS规范只有两句话

    • 1.模块必须要使用 require() 导入

    • 2.模块必须要使用 module.exports 导出

      • 这两个语法都是nodejs环境自带的全局语法

image.png

02-fs模块

1.1-readFile读取文件

//1.导入文件模块
const fs = require('fs')

//2.读取文件

/**
 * 第一个参数:文件路径
 * 第二个参数:编码格式 (可选参数,默认为buffer二进制)
 * 第三个参数:读取回调操作(异步操作)
    * err:如果读取成功,err为null,  否则读取失败(一般文件路径错误或者找不到文件)
    * data:读取到的数据
 */
fs.readFile('./data/aaa.txt','utf-8',(err,data)=>{
    if(err){
        console.log(err)
        //抛出异常,throw的作用就是让node程序终止运行,方便调试
        throw err
    }else{
        console.log(data)
    }
})

conszle.log('11111')

//3.同步读取文件(了解即可,几乎不用,一般在异步的api后面加上Sync就是同步)

let data = fs.readFileSync('./data/aaa.txt','utf-8')
console.log(data)

console.log('2222')

1.2-writeFile写入文件

//1.导入文件模块
const fs = require('fs')

//2.写文件

/**
 * 第一个参数:文件路径
 * 第二个参数:要写入的数据
 * 第三个参数:文件编码 默认utf-8
 * 第四个参数: 异步回调函数
    * err:  如果成功,err为null.否则读取失败
 */
fs.writeFile('./data/bbb.txt','今天星期三','utf-8',(err)=>{
    if(err){
        throw err
    }else{
        console.log('写入成功')
    }
})

03-path路径模块

语法作用
path.==extname==(path)返回路径中文件的扩展名(包含.)
path.==join==([...paths])拼接路径(相对路径)
path.resolve([...paths])拼接路径(绝对路径)
__dirname获取当前文件所在的文件夹绝对路径
//1.导入path模块
const path = require('path')

//2.使用模块

// (1) 获取一个文件的拓展名
/* 不关心此路径文件在不在, 就是处理这个字符串。 获取.后面的部分可以知道这个文件格式 */
console.log(path.extname('./data/student.json'));
console.log(path.extname('./data/student.js'));
console.log(path.extname('./data/111.png'));
console.log(path.extname('./data/222.aaa'));

// (2) 拼接相对路径, 使用join方法
/* 把多个字符串按照路径的方式拼接起来 */
console.log(path.join('a', 'b', 'c'))

// (3) 拼接绝对路径
/* 默认从磁盘根目录开始拼接出完整的路径 */
console.log(path.resolve('a', 'b', 'c'))

/* (4)获取当前文件所在的绝对路径 */
console.log( __dirname )

04-http模块(搭建服务器)

1.1-http模块搭建服务器

//知识点回顾:  如何让你电脑成为服务器?  按照软件即可//1.导入模块(安装软件)
const http = require('http')
​
//2.创建服务器(运行软件)/* 参数:回调函数
    req: request 客户端请求对象
    res:response 服务端响应对象
 */
let server = http.createServer((req,res)=>{
    //获取客户端请求路径
    console.log(req.url)
})
​
//3.启动服务器(开启软件的服务器功能)/*第一个参数:端口号  一般1000-60000之间
第二个参数:ip地址  默认不写 就是本地ip 
第三个参数:成功回调
 */
server.listen(3000,()=>{
    console.log('服务器开启成功')
})

1.2-根据不同请求响应不同数据

默认情况下,浏览器会自动根据文件后缀名进行识别。但是有的文件并不一定可以正确识别,所以一般情况下需要给文件设置对应的响应头。Content-Type类型 (MIME媒体类型)

  • html文件: text/html
  • css文件: text/css
  • js文件: text/javascript
  • gif文件: image/gif
  • svg文件: image/svg+xml
  • jpeg文件: image/jpeg
  • png文件: image/png
  • icon文件: image/x-icon

设置响应头语法如下:res.setHeader('Content-Type', ‘text/html; charset=utf-8');

//1.导入模块
const http = require('http');
//2.创建服务器
let server =  http.createServer((req,res)=>{
    console.log(req.url)
    //需求: 如果请求路径是/ ,响应  index   如果请求路径是/login,响应 登录页
    if(req.url == '/'){
        res.end('index.html')
    }else if(req.url == '/login'){
        //设置响应头解决中文乱码问题: 响应头作用:告诉浏览器我返回给你的数据是什么类型
        /*第一个参数:状态码
        第二个:响应头 
        */
        res.writeHead(200,{
            'Content-Type': 'text/plain;charset=utf-8'// text/plain 普通文本
        })
        res.end('登录页')
    }else{
        res.end('404 not found')
    }
​
})
​
//3.开启服务器
server.listen(3000,()=>{
    console.log('服务器开启成功')
})

1.3-http响应客户端HTML文件

//1.导入模块
const http = require('http')
//文件模块
const fs = require('fs')
//路径模块
const path = require('path')
​
​
​
//2.创建服务器
let server =  http.createServer((req,res)=>{
    //需求:  如果请求路径是 / 返回首页html  如果是login返回登录html
​
    //1.获取客户端请求路径
    let url = req.url
​
    //2.处理请求
    //一般如果响应的是文件,不需要设置响应头,直接返回二进制数据。浏览器会自动识别数据类型并且加载
    if(url == '/'){
        //响应首页
        fs.readFile(path.join(__dirname,'index.html'),(err,data)=>{
            if(err){
                throw err
            }else{
                console.log(data)
                //3,将读取好的文件数据响应给客户端
                res.end(data)
            }
        })
    }else if(url == '/login'){
        //响应登录页
        fs.readFile(path.join(__dirname,'login.html'),(err,data)=>{
            if(err){
                throw err
            }else{
                //3,将读取好的文件数据响应给客户端
                res.end(data)
            }
        })
    }else{
        res.end('404 not found')
    }
})
​
//3.开启服务器
server.listen(3000,()=>{
    console.log('服务器开启成功')
})