nodejs入门

102 阅读7分钟

一.nodejs是什么

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,nodejs允许javascript代码运行在服务端

 1. nodejs不是一门新的编程语言,nodejs是在服务端运行javascript的运行环境
 2. 运行环境:写得程序想要运行必须要有对应的运行环境
     php代码必须要有apache服务器
     在web端,浏览器就是javascript的运行环境
     在node端,nodejs就是javascript的运行环境
 3. javascript并不只是能运行在浏览器端,浏览器端能够运行js是因为浏览器有js解析器,因此只需要有js
    解析器,任何软件都可以运行js。
 4. nodejs可以在服务端运行js,因为nodejs是基于chrome v8的js引擎。

二.浏览器和node的区别

5d99441a7c40276490ad418d28eaac5.png 相同点:nodejs与浏览器都是javascript的运行环境,都能够解析js程序。对于ECMAScript语法来说,在nodejs和浏览器中都能运行。

不同点:nodejs无法使用DOM和BOM的操作,浏览器无法执行nodejs中的文件操作等功能。

三.global模块-全局变量

Node.js 中的全局对象是 global, 类似于浏览器中的window

 console: 用于打印日志
 setTimeout/clearTimeout: 设置清除延时器
 setInterval/clearInterval: 设置清除定时器
 __dirname: 当前文件的路径,不包括文件名  
 __filename: 获取当前文件的路径,包括文件名  

四.fs模块 FileSysten

fs模块是nodejs中最常用的一个模块,因此掌握fs模块非常的有必要,fs模块的方法非常多,用到了哪个查哪个即可。 文档地址:nodejs.cn/api/fs.html

在nodejs中,提供了fs模块,这是node的核心模块

注意:

  1. 除了global模块中的内容可以直接使用,其他模块都是需要加载的。
  2. fs模块不是全局的,不能直接使用。因此需要导入才能使用。

4.1读文件

语法:fs.readFile(path[, options], callback)
//参数1: 文件的路径
//参数2: 编码,如果设置了,返回一个字符串,如果没有设置,会返回一个buffer对象
//参数3: 回调函数
const fs = require("fs");
fs.readFile("data.txt", "utf8",function(err, data){
  console.log(err);
  console.log(data);
});

关于Buffer对象

1. Buffer对象是Nodejs用于处理二进制数据的。
2. 其实任意的数据在计算机底层都是二进制数据,因为计算机只认识二进制。
3. 所以读取任意的文件,返回的结果都是二进制数据,即Buffer对象
4. Buffer对象可以调用toString()方法转换成字符串。

4.2写文件

语法:fs.writeFile(file, data[, options], callback)
//参数1:写入的文件名(如果文件不存在,会自动创建)
//参数2:写入的文件内容(注意:写入的内容会覆盖以前的内容)
//参数3:写文件后的回调函数
fs.writeFile("2.txt", "hello world, 我是一个中国人", function(err){
  if(err) {
    return console.log("写入文件失败", err);
  }
  console.log("写入文件成功");
});

写文件的时候,会把原来的内容给覆盖掉,所以有时候需要追加内容

语法:fs.appendFile(path, data[, options], callback)
//参数1:追加的文件名(如果文件不存在,会自动创建)
//参数2:追加的文件内容(注意:写入的内容会覆盖以前的内容)
//参数3:追加文件后的回调函数
fs.appendFile("2.txt", "我是追加的内容", function(err){
  if(err) {
    return console.log("追加文件内容失败");
  }
  console.log("追加文件内容成功");
})

4.3异步读写文件

//同步读写方式
let data = "This is a file"
fs.writeFileSync("2.txt", data);//同步写文件
var result = fs.readFileSync("2.txt", "utf-8");//读文件,没有回调函数
console.log(result);

五.path模块

绝对路径:`__dirname`: 当前文件的目录,`__filename`: 当前文件的目录,包含文件名
path.join();//拼接路径
path.basename(path[, ext])	返回文件的最后一部分
path.dirname(path)	返回路径的目录名
path.extname(path)	获取路径的扩展名
path.isAbsolute(path)   判断目录是否是绝对路径 

var path = require("path");
var temp = "mytest/test/a.html";
console.log(path.basename(temp));//  a.html
console.log(path.dirname(temp));//   mytest/test
console.log(path.extname(temp));//  .html

六.http模块

6.1 http模块主要用于创建一个web服务器

1. 导入http模块
    const http = require('http')
2.  创建服务器`createServer`
    const server = http.createServer()
3.  给服务器注册`request`事件,有两个参数,req代表请求,res代表响应
    // 需要给服务器注册request事件,当用户请求服务器的时候,request事件就会触发
    // reqeust事件有两个参数, req代表请求, res代表响应
    server.on("request", function(req, res) {
      console.log("我接收到请求了")
    })
4.  启动服务器,监听一个端口,0-65535之间  
    server.listen(8080, function(){
      console.log("服务器启动成功了, 请访问: http://localhost:8080")
    })

注意点: 端口是一个数字,端口的范围是0-65535之间,一般来说0-1023之间的都是系统端口,不建议使用。

6.2 req和res参数的说明

request事件的第一个参数代表的请求对象,里面包含了所有请求相关的信息。

req.url : 可以获取到用户的请求地址
req.method : 可以获取到用户的请求方式,值为GET或者POST
req.headers : 获取到请求头信息

request事件的第二个参数代表响应对象,这个对象用于给浏览器响应

res.write() : 通res.write(data)给浏览器发送请求体,可以调用多次,从而提供连续的请求体
res.end() : 通知服务器,所有响应头和响应主体都已被发送,即服务器将其视为已完成。每一次请求,都必须调用res.end()才能结束请求。可以使用res.end(data)在结束请求的时候发送响应数据
res.statusCode: 是一个属性,不是一个方法,通过res.statusCode=200属性可以设置响应的状态码
res.setHeader: 通过res.setHeader(name, value)方法可以设置响应头,常用于设置content-type,设置响应头和状态码必须在write方法之前
res.writeHead : 通过res.writeHead(statusCode, headers)可以同时设置响应头和状态码

6.3 MIME模块

  1. 浏览器通常使用MIME类型来确定如何处理服务器响应的内容
  2. 常见的MIME 类型 | 菜鸟教程 (runoob.com)
  3. 通过响应头的content-type可以设置mime类型
  4. 如果没有给浏览器设置正确的mime类型,浏览器会根据响应的内容猜测对应的mime类型。但是不能保证所以浏览器能够得到一致的效果。
  5. 对于服务器开发,需要给每一个响应都设置一个正确的mime类型
mime模块的使用
nodejs核心并没有提供用于处理mime的模块。但是我们可以在`npm`上下载开发中遇到的第三方包。
npm install mime
const mime = require('mime')
mime.getType('txt')   // 获取路径对应的MIME类型

6.4 实现静态web服务器

静态web服务器对于浏览器请求的资源,不做任何处理,直接原封不动的就进行响应。即要什么给什么

const http = require('http')
const fs = require('fs')
const path = require('path')
const mime = require('mime')
const server = http.createServer()
server.on('request', (req, res) => {
  // 根据url读取对应的文件
  const filePath = path.join(__dirname, 'www', req.url)
  fs.readFile(filePath, (err, data) => {
    if (err) {
      res.writeHead(404, {
        'content-type': 'text/html;charset=utf-8'
      })
      res.end('404, 你请求的页面不存在!')
    } else {      
      // 设置content-type
      res.writeHead(200, {
        'content-type': mime.getType(req.url)
      })
      res.end(data)
    }
  })
})

server.listen(8080, () => {
  console.log('服务器启动成功了')
})

七.npm的使用

node package manager: node包管理器(包:第三方模块),npm不需要安装,只要安装了node,就自带了npm命令。使用npm初始化一个项目,会生成package.json文件,描述当前项目的信息和当前项目的依赖项,作为一个标准的包,必须要有package.json文件进行描述作为一个标准的项目,必须要有package.json文件进行描述,npm install直接安装项目所有的依赖项

npm init -y: 快速的初始化一个包, 不能是一个中文名
npm install 包名: 安装指定的包名的最新版本到项目中,简写npm i
npm install 包名@版本号: 安装指定包的指定版本
npm uninstall 包名: 卸载已经安装的包

特别的:

  • npm i 包名 --save-dev 如果某个包只是开发阶段用到,打包上线用不到,会记录在package.json中的devDependencies,简写成npm i 包名 -D

全局安装

npm install -g 包名 全局安装,会把npm包安装到C:\Users\用户名\AppData\Roaming\npm目录下,作为命令行工具使用

nrm命令
nrm:npm registry manager(npm仓库地址管理工具)

npm i -g nrm
nrm ls查看仓库地址列表
nrm use taobao 切换仓库地址