Skip to the content.

Node.js


一个文件就是一个模块

function add(a,b){
    return a+b
}

暴露本模块的API,要把要暴露的函数挂载在module.exports上。 当使用require加载这个模块的时候,

加载一个模块

加载一个文件模块

加载一个内置模块

在安装node时就引入的模块,用原生js写的

文件夹模块(第三方模块)

文件夹下有个src文件夹,该文件夹下存引入的模块。直接require(’文件夹名’)是不可以的,因为没有入口文件,需要在文件夹下定义一个package.json,通过npm i引入一个package.json,然后在main定义模块的相对json的路径

模块的查找顺序

内置模块和文件夹模块共存时,会先找内置模块,如果内置模块和文件夹模块同名,则会找到内置模块,不会找文件夹模块。

CMD 和 AMD

主要用在浏览器端

CommonJS规范

每个文件就是一个模块,每个模块都有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。

CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。

CommonJS模块的特点如下

所有代码都运行在模块作用域,不会污染全局作用域。 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。 模块加载的顺序,按照其在代码中出现的顺序。

module

Node内部提供一个Module构建函数。所有模块都是Module的实例。 每个模块内部,都有一个module对象,代表当前模块

node启动http服务

let fs = require('fs')//i添加内置fs模块
let http = require('http')//添加内置http模块

let app = http.createServer((req,res) => {//创建http服务
	if(req.url === '/index.html'){//判断请求的url地址
		fs.readFile('./src/home.html',(error,data)=>{
			if(error){
				console.log(error)
			}else{
				//console.log(data.toString('utf-8'))
				//在node界面打印出不是二进制的数据,如果文件中有编码格式,则不需要加
				
				res.write(data)//将读取的信息反馈给客户端
				res.end();//结束响应
			}
		})
	}
})

app.listen(3000,()=>{
	console.log('服务启动')
})

express

let express = require('express')//引入express模块是一个函数
let app = express();//函数返回一个对象

//路由
app.get('/',(req,res)=>{
	console.log('有人请求')
	res.send('给你了')
})

//监听
app.listen(3000,'localhost',()=>{
	console.log('可以请求了')
})
  1. 路由

     路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。
        
     路由是由一个 URI、HTTP 请求(GET、POST等)和若干个句柄组成,它的结构如下: app.METHOD(path, [callback...], callback), app 是 express 对象的一个实例, METHOD 是一个 HTTP 请求方法, path 是服务器上的路径, callback 是当路由匹配时要执行的函数。
    

    语法:

    app.method(path,callback)

    • 路由路径:可以是字符串类型,也可以是带正则的字符串
  2. 监听

    语法:

    app.listen( port [,ip ,callback] )

    端口是必需的,第二个参数是

response响应

sendFile(path) – 向路径必须是绝对路径,否则不可行 可以使用 __dirname + 相对于当前文件的路径

中间件

中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object(res)),和web应用中处于请求-响应循环流程中的中间件,一般被命名为 next 的变量。

app.use(function(req,res,next){
	console.log('触发2')
	next()
})

语法:obj.use(function(req,res,next){ event })

就是从客户端请求过来一个数据req,在服务器响应数据以前,可以做提前处理,例如重定向等。 可以有多个中间件,依次执行,如果这个中间件处理完数据,必须通知下一个中间件开始处理,通过next()方法通知,

let express = require('express')
let app = express();
//中间件做处理
app.use(function(req,res,next){
    //路径中有这些路径就会被跳转
	let addressArr = ['/a','/b']

	if(addressArr.includes(req.url)){
		if(true){
			res.redirect('/login')//重定向到/login指定返回的页面
		}else{
			next()
		}
	}else{
		next()
	}
})
app.use(function(req,res,next){
	console.log('触发2')
	next()
})

app.get('/',(req,res)=>{
	console.log('有人请求0')
	res.sendFile(__dirname + '/viewspage/home.html' )
})
app.get('/a',(req,res)=>{
	console.log('有人请求a')
	res.sendFile(__dirname + '/viewspage/a.html' )
})
app.get('/b',(req,res)=>{
	console.log('有人请求b')
	res.sendFile(__dirname + '/viewspage/b.html' )
})
app.get('/login',(req,res)=>{
	console.log('有人请求b')
	res.sendFile(__dirname + '/viewspage/login.html' )
})

app.listen(3000,'localhost',()=>{

	console.log('可以请求了')
})

静态文件目录

在express中预留了一个属性static,用来定义静态文件目录
定义:定义指定静态文件目录

图片css和js等静态文件都是存放在这个文件夹下,在index.html中引用这些静态文件的时候, 不是相对于这个html文件引用了,而是相对于定义的这个指定静态文件目录了,不用写

app.use(express.static('./viewspage'))

get请求

get请求在url中的?后面传输数据,express会通过req.query获取到?后面的数据,并把它转为一个对象。