开发者学堂课程【Node.js 入门与实战:通过 express 模拟 Apache 实现静态资源托管服务】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/588/detail/8317
通过 express 模拟 Apache 实现静态资源托管服务
使用express模拟Apache服务器
之前模拟apache服务器的功能是先在服务器端建一个文件夹,把所有静态资源放到文件夹下面,监听用户的requires事件当requires事件过来以后,用户请求的路径和文件夹路径拼起来,然回去文件夹下找对应的静态资源。找到静态资源进行读取后返回,找不到就提示404找不到这个文件。
当使用express来模拟apache服务器,核心只有一句代码。
1.模拟Apache服务器
//入口文件
//模拟静态资源服务器(Apache服务器)
//加载express模块
var express = require(
‘
express
’
);
var path = require(
’
path
’
);
//创建app对象
var app = express();
//处理静态资源的方法
//var fn =express.static(path.join(__dirname
,’
public
’
))
//注册路由
//app.use(
‘/’
,fn);
app.use(
‘
/
’
,express.static(path.join(
__
dirname ,
‘
public
’
))
)
;
//启动服务
app.listen(9999, function (
)
{
consoLe.log(
‘
http: / /localhost:999
9’
);
});
先建一个package json文件安装express 。然后加载express模块,第二步创建app对象,中间注册路由最后启动服务,启动完服务之后然后访问。
因为要模拟apache服务器,所以要在当前的项目下创建一个目录文件夹在里面放静态资源。要把创建目录下静态资源暴露给外界,浏览器就可以通过这个路径来访问。
其实核心就app.use(‘/’,fn);这里用的是use,它可以传两个参数第一个要匹配路径,这里传一个根目录表示请求这个网站下的任何一个路径,都认为是要找这个静态资源。
Express有一个方法,它会自动生成一个方法就是处理静态资源的方法,在这声明一个变量里面保存一个函数,static这个方法它会返回一个函数,它就是处理对应静态资源的一个函数。
现在假设fn函数就是用来处理静态资源的函数,但是fn不知道静态资源放在什么地方。需要在static里面传一个参数过来,这样的话就告诉static静态资源都放在public下,它就会在这个目录下生成一个函数。
2.查看fn的源代码
把fn打印一下查看一下源代码
var fn =express.static(path.join(__dirname,’public’))
console.log(fn.toString());
一个函数toString就可以看到函数的源代码
function servestatic(req, res, next)
{
if (req.method !== 'GET' &8 req.method !== "HEAD'){if (fallthrough) {
lreturn next()
}
/ / method not allowedres.statusCode = 405
res.setHeader( ' Allow ' , 'GET,HEAD')
res.setHeader( 'Content-Length', 'e')
res.end()
return
}
var forwardError = !fallthrough
var originalUrl = parseUrl.original(req)
var path = parseUrl(req).pathname
//make sure redirect occurs at mount
if (path =z= '/' && originalUrl.pathname.substr(-1)!== '/'){
path -=''
}
//create send stream
var stream = send(req, path,opts)
// add directory handler
stream.on( 'directory ' , onDirectory)
//add headers listener
if (setHeaders) {
stream.on( ' headers', setHeaders)
}
//add file listener for fallthroughif (fallthrough)
If (fallthrough){
stream.on( 'file', function onFile (){
// once file is determined,always forward error
forwardError = true
})
}
//forward errors
stream.on( 'error', function error (err) {
if (forwardError ll !(err.statusCode < 500)){
next(err)
return
}
next()
})
//pipe
stream.pipe(res)
}
这就是我们的源代码
根据用户请求的路径,去读取目录下的静态资源