引入模板引擎(handlebars)

cnpm i handlebars

结构大概是这样子的,新建模板dir.tpl文件和route.js

dir.tpl

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>{{title}}</title>
</head>
<body>
{{#each files}}
<a href="{{../dir}}/{{this}}">{{this}}</a>
{{/each}}
</body>
</html>

route.js

const fs =require('fs')
const path = require('path')
const Handlebars = require('handlebars')
const promisify = require('util').promisify;
const stat = promisify(fs.stat)
const readdir = promisify(fs.readdir);
const config = require('../config/defaultConfig') const tplPath = path.join(__dirname,'../template/dir.tpl')
const source = fs.readFileSync(tplPath);
const template = Handlebars.compile(source.toString())
module.exports=async function(req,res,filePath){ try{
const stats =await stat(filePath)
if(stats.isFile()){
res.statusCode = 200
res.setHeader('content-Type','text/plain') fs.createReadStream(filePath).pipe(res);
// fs.readFile(filePath,(err,data)=>{
// res.end(data)
// });
}else if(stats.isDirectory()){
//所有异步调用必须用await
const files =await readdir(filePath);
res.statusCode = 200
res.setHeader('content-Type','text/html')
const dir = path.relative(config.root,filePath)
const data = {
title:path.basename(filePath),
// dir:config.root,
dir:dir?`/${dir}`:'',
files
}
res.end(template(data));
}
}catch(ex){
console.error(ex);
res.statusCode = 404
res.setHeader('content-Type','text/plain')
res.end(`${filePath} is not a directory or file\n ${ex.error}`)
}
}

app.js

const http = require('http');
const chalk = require('chalk')
const path = require('path')
const conf = require('./config/defaultConfig.js');
const route = require('./helper/route')
const server = http.createServer((req,res)=>{
const url = req.url;
//拿到文件路径
const filePath = path.join(conf.root,req.url)
route(req,res,filePath)
}); server.listen(conf.port,conf.hostname,()=>{
const addr = `http://${conf.hostname}:${conf.port}`;
console.log(`Server started at ${chalk.green(addr)}`);
})

最新文章

  1. App Extension访问Cocoapods引入的第三方库
  2. 浩瀚PDA开单器-结束手工开单模式【百货、商超】PDA安卓智能手持POS 进销存管理系统移动收银管理软件
  3. path入门 20141102-1405
  4. nodeJs 初探 ~
  5. 运行时报错 ADB server didn’t ACK
  6. 【Excel】Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046}:
  7. Linux 下挂载硬盘的 方法
  8. Java 8 被动迭代式特性介绍(转自IBM)
  9. 基于DateTime Picker修改成类似旅游网站出发日期选择的功能
  10. LeetCode 二叉树的最小深度
  11. 我的Python成长之路---第一天---Python基础(6)---2015年12月26日(雾霾)
  12. 【EasyNetQ】- 发布/订阅模式
  13. 减肥标准BMI指数
  14. 洛谷 P1396 营救
  15. AntDesign从入门到精通
  16. js获取精确的元素宽高(普通获取高度会有误差)
  17. C++ dynamic_cast 的使用
  18. 与其他Javascript类库冲突解决方案
  19. chrome devtools的debug相关
  20. 【bzoj3295】[Cqoi2011]动态逆序对 树套树 线段树套替罪羊树

热门文章

  1. java的回调和C#的委托
  2. PIC18F45K80串口1和串口2异步收发通信实例
  3. Fortran文件读写--xdd
  4. URL基本语法
  5. Caffe 图像分类
  6. VS Code实现markdown画流程图
  7. Java工作流引擎全局变量的介绍
  8. Bash Shell编程简记
  9. GO富集分析示例【华为云技术分享】
  10. Numpy用于数组数据的存储和读取