Node学习8-handlebars模板

npm install handlebars

像apk这种文件,虽然返回值是text/plain,但是直接就下载了,真智能。

        //把访问的绝对路径拼出来
        //如果别人想看根目录之前的呢?手动输入\..也会变成/,我也不知道为什么
        console.log(req.url);
        var filePath = path.join(process.cwd(),req.url);
        console.log(‘绝对路径‘+filePath);
        //查看访问的这个路径的信息
        //如果访问127.0.0.1:3000的话,其实就是访问的当前根目录,因为url是空or\
        fs.stat(filePath,(err,stats)=>{

            if(err){
                res.statusCode=404;
                res.setHeader(‘Content-Type‘,‘text/plain‘);
                res.end(filePath+‘is not exsit!‘);
                //结束这个函数
                return;
            }

            //如果是文件,显示内容
            if(stats.isFile()){
                res.statusCode=200;
                const ext = type(path.extname(filePath));
                console.log(ext);
                res.setHeader(‘Content-Type‘,ext);
                res.setHeader(‘charset‘,‘utf-8‘);
                //当然用readFile也可以,但是对于浏览器来说,流的方式是最快的
                //比如apk等文件,流要比readFile快很多很多很多
                fs.createReadStream(filePath).pipe(res);

                // fs.readFile(filePath,(err,data)=>{
                //     //console.log(data.toString());
                //     res.end(data.toString());
                // });

            }else if(stats.isDirectory()){
                //如果是目录,返回文件列表
                fs.readdir(filePath,(err,files)=>{

                    res.statusCode=200;
                    res.setHeader(‘Content-Type‘,‘text/html‘);
                    // //files是string[],join是用,分割并返回字符串
                    // res.end(files.join(‘,‘));
                    const data = {
                        title:path.basename(filePath),
                        //当前路径名
                        //process.cwd()不行,因为这是node app.js运行的路径,就是说永远是src,请求永远是src/xxx.js肯定不对
                        //中途的文件夹都被删掉了
                        //因为当前就是一个文件夹啊....所以返回自己就可以了
                        //绝对路径D:\南京实验室相关\FileServer\src\D:\%E5%8D%97%E4%BA%AC%E5%AE%9E%E9%AA%8C%E5%AE%A4%E7%9B%B8%E5%85%B3\FileServer\src\config\serverConfig.js
                        //filePath,直接这样也不行,因为是通过root+url拼起来的,url变成绝对路径,就会像上面一样重叠了
                        //直接用的上面的files
                        filePath,
                        //返回与src之间的相对路径
                        dir:path.relative(process.cwd(),filePath),
                        files
                    };
                    res.end(dirTemplate(data));

                });
            }

        });
const type = {

    ‘js‘:‘text/javascript‘,
    ‘ico‘:‘image/x-icon‘,
    ‘txt‘:‘text/plain‘,
    ‘jpg‘:‘image/jpeg‘

}

module.exports = (file)=>{

    //最后一个
    let ext = file.split(‘.‘).pop();

    return type[ext] || type[‘txt‘];

}

dir.html

<html>

<head>
    <meta charset="utf-8">
    <title>{{title}}</title>
</head>

<body>
    <p>{{filePath}}</p>

    <!-- each作用域里面只会找files里面的元素,查不到外部元素比如filePath -->
    <!-- 必须改成../dir,我还以为是路径问题呢。。。真的混淆 -->
    {{#each files}}
        <a href="{{../dir}}/{{this}}">{{this}}</a>
        <br>
    {{/each}}
</body>

</html>

原文地址:https://www.cnblogs.com/weizhibin1996/p/9296478.html

时间: 2024-10-10 12:20:13

Node学习8-handlebars模板的相关文章

Node学习之(第三章:art-template模板引擎的使用)

前言 大家之前都有使用过浏览器中js模板引擎,其实在Node.js中也可以使用模板引擎,最早使用模板引擎的概念是在服务端新起的. art-template art-template是一款高性能的JavaScript 模板引擎,不仅可以在浏览器(前端)使用,同时也可以在Node中使用. GitHub地址:art-template 文档:官方中文 本章节我们来探讨下Node中使用art-template模板引擎生成一个标准的HTML文档. 主体 art-template原理就是将一个字符串数据按照模

C++ Primer 学习笔记_77_模板与泛型编程 --实例化

模板与泛型编程 --实例化 引言: 模板是一个蓝图,它本身不是类或函数.编译器使用模板产生指定的类或函数的特定版本号.产生模板的特定类型实例的过程称为实例化. 模板在使用时将进行实例化,类模板在引用实际模板类型时实例化,函数模板在调用它或用它对函数指针进行初始化或赋值时实例化. 1.类的实例化 当编写Queue<int>qi时,编译器自己主动创建名为Queue<int>的类.实际上,编译器通过又一次编写Queue模板,用类型int取代模板形參的每次出现而创建Queue<int

C++ Primer 学习笔记_81_模板与泛型编程 --类模板成员[续1]

模板与泛型编程 --类模板成员[续1] 二.非类型形参的模板实参 template <int hi,int wid> class Screen { public: Screen():screen(hi * wid,'#'), cursor(hi * wid),height(hi),width(wid) {} //.. private: std::string screen; std::string::size_type cursor; std::string::size_type height

C++ Primer 学习笔记_82_模板与泛型编程 --类模板成员[续2]

模板与泛型编程 --类模板成员[续2] 六.完整的Queue类 Queue的完整定义: template <typename Type> class Queue; template <typename Type> ostream &operator<<(ostream &,const Queue<Type> &); template <typename Type> class QueueItem { friend clas

node学习错题集

1.请求路径/favicon.ico 问题:node http.createServer()创建服务器,用户请求一次,但是服务器显示两次请求:一次为用户请求,一次请求路径为/favicon.ico ?? 代码如下: var http = require('http'); http.createServer(function(req,res){ console.log( req.url ); }).listen(8080);console.log("The server is on ...&quo

[学姿势]实验室搬砖+node学习

这周开始进行收尾工作,我当然没有进行核心技术的开发,主要负责的是对web端进行展示上的修修补补,主要包括添加VLC播放器.rtsp视频流以及一些js细节. 1.VLC 全称为Video Lan Client,此播放器支持各种格式,在平台中主要作为播放实时视频的工具.首先找到VLC的wiki,webplugin一节中有快速上手的文字,学习一些播放控制的方法.对于web端,通过html的OBJECT标签在网页中加入播放器,在target属性中写入实时监控的视频即可.其中还有一些其他参数用来控制播放.

C++ Primer 学习笔记_75_模板与泛型编程 --模板定义

模板与泛型编程 --模板定义 引言: 所谓泛型程序就是以独立于不论什么特定类型的方式编写代码.使用泛型程序时,我们须要提供详细程序实例所操作的类型或值. 模板是泛型编程的基础.使用模板时能够无须了解模板的定义. 泛型编程与面向对象编程一样,都依赖于某种形式的多态性.面向对象编程中的多态性在执行时应用于存在继承关系的类.我们能够编写使用这些类的代码,忽略基类与派生类之间类型上的差异.仅仅要使用基类的引用或指针,基类类型或派生类类型的对象就能够使用同样的代码. 在泛型编程中,我们所编写的类和函数能够

C++ Primer 学习笔记_84_模板与泛型编程 --模板特化

模板与泛型编程 --模板特化 引言: 我们并不总是能够写出对全部可能被实例化的类型都最合适的模板.某些情况下,通用模板定义对于某个类型可能是全然错误的,通用模板定义或许不能编译或者做错误的事情;另外一些情况下,能够利用关于类型的一些特殊知识,编写比从模板实例化来的函数更有效率的函数. compare函数和 Queue类都是这一问题的好样例:与C风格字符串一起使用进,它们都不能正确工作. compare函数模板: template <typename Type> int compare(cons

C++ Primer 学习笔记_83_模板与泛型编程 --一个泛型句柄类

模板与泛型编程 --一个泛型句柄类 引言: [小心地雷] 这个例子体现了C++相当复杂的语言应用,理解它需要很好地理解继承和模板.在熟悉了这些特性之后再研究这个例子也许会帮助.另一方面,这个例子还能很好地测试你对这些特性的理解程度. 前面示例的Sales_item和Query两个类的使用计数的实现是相同的.这类问题非常适合于泛型编程:可以定义类模板管理指针和进行使用计数.原本不相关的Sales_item类型和 Query类型,可通过使用该模板进行公共的使用计数工作而得以简化.至于是公开还是隐藏下

OpenCV 学习笔记(模板匹配)

OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够高时,就认为找到了我们的目标. 在 OpenCV 中,提供了相应的函数完成这个操作. matchTemplate 函数:在模板和输入图像之间寻找匹配,获得匹配结果图像 minMaxLoc 函数:在给定的矩阵中寻找最大和最小值,并给出它们的位置 在具体介绍这两个函数之前呢,我们还要介绍一个概念,就是如何来评价两