创建一个简单的静态服务器

320 阅读1分钟

依赖:ts-node-dev

node模块声明文件:@type/node

建立一个可以运行的服务器

const server = http.createServer()

server.on('request',(request:IncomingMessage,response:ServerResponse)=>{
	response.serHeaders()
    response.statusCode = 200
    response.write(//...)
    response.end()
})

server.lsiten(8888,()=>{})

获取请求体

request有一个data事件可以监听请求体,还有一个end事件,当请求上传完成时触发

const array = []
request.on('data',(chunk)=>{
    array.push(chunk)
})

request.on('end',()=>{
    const body = Buffer.concat(array).toString()
	response.end()
    //异步操作,所以需要一个end
})

服务器是如何获取路径的

  1. 获取当前路径 __dirname
  2. 拼接文件夹路径
import * as p from 'path';
const path = p.resolve(\__dirname,'public')
  1. 拼接文件路径
// 获取文件名
import * as url from 'url';
const object = url.parse(request.path)
const {filename,search} = object
p.resolve(path,filename)

此外,我们还可以通过

response.setHeader('Cache-Control','public,maxage = 3600 * 24 * 365')

设置缓存时间,加快服务器响应


完整代码

import * as http from 'http';
import {IncomingMessage, ServerResponse} from 'http';
import * as fs from 'fs';
import * as p from 'path';
import * as url from 'url';


// 声明请求
const server = http.createServer();
const publicDir = p.resolve(__dirname, `public`);
//监听请求
server.on('request', (request: IncomingMessage, response: ServerResponse) => {
    const {url: path, method, headers} = request;
    //获取查询参数
    if (method !== 'GET') {
      response.statusCode = 405;
      response.end();
      return;
    }
    const object = url.parse(path);
    const {pathname, search} = object;
    let filename = pathname.substring(1);
    if (filename === '') {filename = 'index.html';}
    fs.readFile(p.resolve(publicDir, filename), (error, data) => {
      if (error) {
        response.statusCode = 404;
        response.end();
      } else {
        response.setHeader('Cache-control', `public,max-age=${3600 * 24 * 365}`);
        response.end(data);
      }
    });
  }
);
//监听端口
server.listen(8888, () => {
  // console.log(server.address());
  //目前的地址
});