天天看点

node.js入门学习笔记整理kristy1993node.js入门学习笔记整理

node.js入门学习笔记整理kristy1993node.js入门学习笔记整理

kristy1993

node.js入门学习笔记整理

(1)node

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。

Node与javaScript的区别在于,javaScript的顶层对象是window,而node是global

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#008000">//这里使用的var声明的变量不是全局的,是当前模块下的,用global声明的表示是全局的</span>
<span style="color:#0000ff">var</span> s = 100;
global.s = 200;
<span style="color:#008000">//这里访问到的s是var生命的</span>
<span style="color:#0000ff">console</span>.log(s); <span style="color:#008000">//100</span>
<span style="color:#008000">//这里访问到的才是全局变量</span>
<span style="color:#0000ff">console</span>.log(global.s); <span style="color:#008000">//200</span></code></span></span>
           

模块:在node中,文件和模块是一一对应的,也就是一个文件就是一个模块;每个模块都有自己的作用域,我们通过var申明的变量并非全局而是该模块作用域下的。

(2)module模块

1、文件查找

1)首先按照加载的模块的文件名称进行查找,如果没有找到,则会带上 .js、.json 或 .node 拓展名在加载

2)以 '/' 为前缀的模块是文件的绝对路径。 例如,require('/home/marco/foo.js') 会加载 /home/marco/foo.js 文件。

3)以 './' 为前缀的模块是相对于调用 require() 的文件的。 也就是说,circle.js 必须和 foo.js 在同一目录下以便于 require('./circle') 找到它。

4)当没有以 '/'、'./' 或 '../' 开头来表示文件时,这个模块必须是一个核心模块或加载自 node_modules 目录。

5)如果给定的路径不存在,则 require() 会抛出一个 code 属性为 'MODULE_NOT_FOUND' 的 Error。

2、module 作用域

在一个模块中通过var定义的变量,其作用域范围是当前模块,外部不能够直接的访问,如果我们想一个模块能够访问另外一个模块中定义的变量,可以有一下两种方式:

1)把变量作为global对象的一个属性,但这样的做法是不推荐的

2)使用模块对象 module。module保存提供和当前模块有关的一些信息。

在这个module对象中有一个子对象exports对象,我们可以通过这个对象把一个模块中的局部变量对象进行提供访问。

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#008000">//这个方法的返回值,其实就是被加载模块中的module.exports</span>
<span style="color:#0000ff">require</span>(<span style="color:#a31515">'./02.js'</span>);</code></span></span>
           

3、__dirname:当前模块的目录名。

<span style="color:#000000"><span style="color:#000000"><code>例子,在 /Users/mjr 目录下运行 node example.js:
console.log(__dirname);
// 输出: /Users/mjr
console.log(path.dirname(__filename));
// 输出: /Users/mjr</code></span></span>
           

4、__filename:当前模块的文件名(处理后的绝对路径)。当前模块的目录名可以使用 __dirname 获取。

<span style="color:#000000"><span style="color:#000000"><code>在 /Users/mjr 目录下运行 node example.js:

<span style="color:#0000ff">console</span>.log(__filename);
<span style="color:#008000">// 输出: /Users/mjr/example.js</span>
<span style="color:#0000ff">console</span>.log(__dirname);
<span style="color:#008000">// 输出: /Users/mjr</span></code></span></span>
           

(3)process(进程)

process 对象是一个全局变量,提供 Node.js 进程的有关信息以及控制进程。 因为是全局变量,所以无需使用 require()。

1、process.argv

返回进程启动时的命令行参数。第一个元素是process.execPath。第二个元素是当前执行的JavaScript文件的路径。剩余的元素都是额外的命令行参数。

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#0000ff">console</span>.log(<span style="color:#0000ff">process</span>.argv);</code></span></span>
           

打印结果:

node.js入门学习笔记整理kristy1993node.js入门学习笔记整理

2、process.execPath返回启动进程的可执行文件的绝对路径。

3、process.env 返回用户的环境信息。

在process.env中可以新增属性:

<span style="color:#000000"><span style="color:#000000"><code>process.<span style="color:#0000ff">env</span>.foo = <span style="color:#a31515">'bar'</span>;
console.log(process.<span style="color:#0000ff">env</span>.foo);</code></span></span>
           

可以通过delete删除属性:

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#0000ff">delete</span> <span style="color:#0000ff">process</span>.env.foo;
<span style="color:#0000ff">console</span>.log(<span style="color:#0000ff">process</span>.env);</code></span></span>
           

在Windows上,环境变量不区分大小写

4、process.pid 属性返回进程的PID。

5、process.platform属性返回字符串,标识Node.js进程运行其上的操作系统平台。

6、process.title 属性用于获取或设置当前进程在 ps 命令中显示的进程名字

7、process.uptime() 方法返回当前 Node.js 进程运行时间秒长

注意: 该返回值包含秒的分数。 使用 Math.floor() 来得到整秒钟。

8、process.versions属性返回一个对象,此对象列出了Node.js和其依赖的版本信息。

process.versions.modules表明了当前ABI版本,此版本会随着一个C++API变化而增加。 Node.js会拒绝加载模块,如果这些模块使用一个不同ABI版本的模块进行编译。

9、process对象-输入输出流

<span style="color:#000000"><span style="color:#000000"><code>
var a;
var b;
process.stdout.write(<span style="color:#a31515">'请输入a的值: '</span>);
process.stdin.on(<span style="color:#a31515">'data'</span>, (chunk) => {
    <span style="color:#0000ff">if</span> (!a) {
        a = Number(chunk);
        process.stdout.write(<span style="color:#a31515">'请输入b的值:'</span>);
    }<span style="color:#0000ff">else</span>{
        b = Number(chunk);
        process.stdout.write(<span style="color:#a31515">'a+b的值:'</span>+(a+b));
        process.<span style="color:#0000ff">exit</span>();
    }
});
</code></span></span>
           

(4)Buffer缓冲器

Buffer类,一个用于更好的操作二进制数据的类,我们在操作文件或者网络数据的时候,其实操作的就是二进制数据流,Node为我们提供了一个更加方便的去操作这种数据流的类Buffer,他是一个全局的类

1、如何创建使用buffer

Buffer.from(array) 返回一个 Buffer,包含传入的字节数组的拷贝。

Buffer.from(arrayBuffer[, byteOffset [, length]]) 返回一个 Buffer,与传入的 ArrayBuffer 共享内存。

Buffer.from(buffer) 返回一个 Buffer,包含传入的 Buffer 的内容的拷贝。

Buffer.from(string[, encoding]) 返回一个 Buffer,包含传入的字符串的拷贝。

Buffer.alloc(size[, fill[, encoding]]) 返回一个指定大小且已初始化的 Buffer。 该方法比 Buffer.allocUnsafe(size) 慢,但能确保新创建的 Buffer 不会包含旧数据。

Buffer.allocUnsafe(size) 与 Buffer.allocUnsafeSlow(size) 返回一个指定大小但未初始化的 Buffer。 因为 Buffer 是未初始化的,可能包含旧数据。

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#008000">// 创建一个长度为 10、且用 01 填充的 Buffer。</span>
<span style="color:#0000ff">const</span> buf1 = Buffer.alloc(10,1);
<span style="color:#008000">// 创建一个长度为 10、且未初始化的 Buffer。</span>
<span style="color:#008000">// 这个方法比调用 Buffer.alloc() 更快,但返回的 Buffer 实例可能包含旧数据,因此需要使用 fill() 或 write() 重写。</span>
<span style="color:#0000ff">const</span> buf2 = Buffer.allocUnsafe(10);
<span style="color:#0000ff">const</span> buf3 = Buffer.from([1, 2, 3]);
<span style="color:#0000ff">const</span> buf4 = Buffer.from(<span style="color:#a31515">'tést'</span>);
<span style="color:#0000ff">console</span>.log(buf1); <span style="color:#008000">//<Buffer 01 01 01 01 01 01 01 01 01 01></span>
<span style="color:#0000ff">console</span>.log(buf2); <span style="color:#008000">//<Buffer 00 00 00 00 08 00 00 00 07 00></span>
<span style="color:#0000ff">console</span>.log(buf3); <span style="color:#008000">//<Buffer 01 02 03></span>
<span style="color:#0000ff">console</span>.log(buf4); <span style="color:#008000">//<Buffer 74 c3 a9 73 74></span></code></span></span>
           

2、Buffer对象提供的toString、JSON的使用

1)buf.toString(encoding,start,end)

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#0000ff">var</span> bf = Buffer.from(<span style="color:#a31515">'miaov'</span>);
<span style="color:#0000ff">console</span>.log(bf.toString(<span style="color:#a31515">'utf-8'</span>,1,4)); <span style="color:#008000">//iaov</span>
<span style="color:#0000ff">console</span>.log(bf.toString(<span style="color:#a31515">'utf-8'</span>,0,5)); <span style="color:#008000">//miaov</span>
<span style="color:#0000ff">console</span>.log(bf.toString(<span style="color:#a31515">'utf-8'</span>,0,6)); <span style="color:#008000">//miaov</span></code></span></span>
           

2)buf.write(string,offset,length,encoding)

string 要写入 buf 的字符串。

offset 开始写入的偏移量。默认 0,这里指的是buffer对象的起始要写入的位置。

length 要写入的字节数。默认为 buf.length - offset。

encoding string 的字符编码。默认为 'utf8'。

返回: 已写入的字节数。

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#0000ff">var</span> str = <span style="color:#a31515">"miaov hello"</span>;
<span style="color:#0000ff">var</span> bf = Buffer.from(str);
<span style="color:#0000ff">var</span> bf2 = Buffer.alloc(8);
<span style="color:#008000">//从0开始写入5个</span>
bf2.write(str,0,5);
<span style="color:#0000ff">console</span>.log(bf);
<span style="color:#0000ff">console</span>.log(bf2);</code></span></span>
           

3)buf.toJSON()

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#0000ff">const</span> buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
<span style="color:#0000ff">const</span> json = <span style="color:#0000ff">JSON</span>.stringify(buf);

<span style="color:#0000ff">console</span>.log(json);
<span style="color:#008000">// 输出: {"type":"Buffer","data":[1,2,3,4,5]}</span></code></span></span>
           

3、Buffer中静态方法的使用

1)Buffer.isEncoding(encoding) : 判断是否是Buffer支持的字符编码,是则返回true,不是则返回false

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#0000ff">console</span>.log(Buffer.isEncoding(<span style="color:#a31515">'utf-8'</span>)); <span style="color:#008000">//true</span></code></span></span>
           

2)Buffer.isBuffer(obj) :如果 obj 是一个 Buffer,则返回 true,否则返回 false。

(5)fs(文件系统)

该模块是核心模块,需要使用require('fs')导入后使用,该模块主要用来操作文件

1、fs.open(path, flags, mode, callback)

path:要打开的文件的路径;

flags:打开文件的方式 读/写;

mode:设置文件的模式 读/写/执行

callback(err,fd):文件打开以后,在回调函数中做相应的处理,回调函数的两个参数:

err:文件打开失败的错误保存在err里面,如果成功err为null

fd:被打开文件的标识

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#0000ff">var</span> fs = <span style="color:#0000ff">require</span>(<span style="color:#a31515">'fs'</span>);
fs.open(<span style="color:#a31515">'./test.txt'</span>,<span style="color:#a31515">'r'</span>,<span style="color:#0000ff">function</span>(err,fd){
  <span style="color:#0000ff">if</span>(err){
        <span style="color:#0000ff">console</span>.log(<span style="color:#a31515">"文件打开失败"</span>);
    }<span style="color:#0000ff">else</span>{
        <span style="color:#0000ff">console</span>.log(<span style="color:#a31515">"文件打开成功"</span>);
    }
});
</code></span></span>
           

2、fs.openSync(path, flags, mode) :返回文件描述符。

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#0000ff">var</span> fs = <span style="color:#0000ff">require</span>(<span style="color:#a31515">'fs'</span>);
<span style="color:#0000ff">console</span>.log(fs.openSync(<span style="color:#a31515">'./test.txt'</span>,<span style="color:#a31515">'r'</span>)); <span style="color:#008000">//3</span></code></span></span>
           

3、fs.read(fd, buffer, offset, length, position, callback)

从 fd 指定的文件中读取数据;

buffer 指定要写入数据的 buffer;

offset 指定 buffer 中开始写入的偏移量;

length 指定要读取的字节数;

position 指定文件中开始读取的偏移量。 如果 position 为 null,则从文件的当前位置开始读取;

callback 有三个参数 (err, bytesRead, buffer)

示例:test.txt 中的值为123456789

<span style="color:#000000"><span style="color:#000000"><code>fs.open(<span style="color:#a31515">'./test.txt'</span>,<span style="color:#a31515">'r'</span>,<span style="color:#0000ff">function</span>(err,fd){
    <span style="color:#0000ff">if</span>(!err){
        <span style="color:#0000ff">var</span> bf = Buffer.alloc(5);
        fs.read(fd,bf,0,5,0,<span style="color:#0000ff">function</span>(){
            <span style="color:#0000ff">console</span>.log(bf.toString()); <span style="color:#008000">//12345</span>
        })
    }
});</code></span></span>
           

4、fs.write(fd, buffer, offset, length, position, callback)

将 buffer 写入到 fd 指定的文件。

offset 指定 buffer 中要开始被写入的偏移量,length 指定要写入的字节数。

position 指定文件中要开始写入的偏移量。 如果 typeof position !== 'number',则从当前位置开始写入。

callback 有三个参数 (err, bytesWritten, buffer),其中 bytesWritten 指定 buffer 中已写入文件的字节数。

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#0000ff">var</span> fs = <span style="color:#0000ff">require</span>(<span style="color:#a31515">'fs'</span>);

fs.open(<span style="color:#a31515">'./test.txt'</span>,<span style="color:#a31515">'r+'</span>,<span style="color:#0000ff">function</span>(err,fd){
    <span style="color:#0000ff">if</span>(!err){
        <span style="color:#0000ff">var</span> bf = Buffer.alloc(5);
        fs.read(fd,bf,0,5,0,<span style="color:#0000ff">function</span>(){
            <span style="color:#0000ff">console</span>.log(bf.toString()); <span style="color:#008000">//12345</span>
        });
        <span style="color:#0000ff">var</span> bf = Buffer.from(<span style="color:#a31515">'test数据'</span>);
        fs.write(fd,bf,0,10,0);
        fs.write(fd,<span style="color:#a31515">'测试数据2'</span>,10,<span style="color:#a31515">'utf-8'</span>);

    }
});</code></span></span>
           

fs.write(fd, string, position, encoding, callback)

将 string 写入到 fd 指定的文件。 如果 string 不是一个字符串,则会强制转换成字符串。

position 指定文件中要开始写入的偏移量。 如果 typeof position !== 'number',则从当前位置开始写入。

encoding 指定字符串的编码。

callback 有三个参数 (err, written, string),其中 written 指定字符串中已写入文件的字节数。 写入的字节数与字符串的字符数是不同的。

5、fs.exists(path,callback)检查指定路径的文件或者目录是否存在

fs.appendFile(path, data, callback):将数据追加到文件,如果文件不存在则创建文件。

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#008000">//检查文件是否存在</span>
<span style="color:#0000ff">var</span> fs = <span style="color:#0000ff">require</span>(<span style="color:#a31515">'fs'</span>);
<span style="color:#0000ff">var</span> filename = <span style="color:#a31515">'./test2.txt'</span>;
fs.exists(filename,<span style="color:#0000ff">function</span>(isExists){
        <span style="color:#0000ff">if</span>(!isExists){
            fs.writeFile(filename,<span style="color:#a31515">'miaov'</span>,<span style="color:#0000ff">function</span>(err){
                <span style="color:#0000ff">if</span>(err){
                    <span style="color:#0000ff">console</span>.log(<span style="color:#a31515">"文件创建失败"</span>);
                }<span style="color:#0000ff">else</span>{
                    <span style="color:#0000ff">console</span>.log(<span style="color:#a31515">"文件创建成功"</span>);
                }
            });
        }<span style="color:#0000ff">else</span>{
            fs.appendFile(filename,<span style="color:#a31515">'-leo'</span>,<span style="color:#0000ff">function</span>(err){
                <span style="color:#0000ff">if</span>(err){
                    <span style="color:#0000ff">console</span>.log(<span style="color:#a31515">"文件内容追加失败"</span>);
                }<span style="color:#0000ff">else</span>{
                    <span style="color:#0000ff">console</span>.log(<span style="color:#a31515">"文件内容追加成功"</span>);
                }
            })
        }
});</code></span></span>
           

(6)前端项目自动化构建

1、创建myProject项目文件以及对应的文件夹

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#0000ff">var</span> projectData ={
    <span style="color:#a31515">'name'</span>:<span style="color:#a31515">'myProject'</span>,
    <span style="color:#a31515">'fileData'</span>:[
        {
            <span style="color:#a31515">'name'</span>:<span style="color:#a31515">'css'</span>,
            <span style="color:#a31515">'type'</span>:<span style="color:#a31515">'dir'</span>
        },{
            <span style="color:#a31515">'name'</span>:<span style="color:#a31515">'js'</span>,
            <span style="color:#a31515">'type'</span>:<span style="color:#a31515">'dir'</span>
        },{
            <span style="color:#a31515">'name'</span>:<span style="color:#a31515">'images'</span>,
            <span style="color:#a31515">'type'</span>:<span style="color:#a31515">'dir'</span>
        },{
            <span style="color:#a31515">'name'</span>:<span style="color:#a31515">'index.html'</span>,
            <span style="color:#a31515">'type'</span>:<span style="color:#a31515">'file'</span>,
            <span style="color:#a31515">'content'</span> : <span style="color:#a31515">'<html>\n\t<head>\n\t\t<title>title</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello</h1>\n\t</body>\n</html>'</span>
        }
    ]
};

<span style="color:#0000ff">var</span> fs = <span style="color:#0000ff">require</span>(<span style="color:#a31515">'fs'</span>);

<span style="color:#0000ff">if</span>(projectData.name){
    <span style="color:#008000">// 创建项目文件夹</span>
    fs.mkdirSync(projectData.name);
    <span style="color:#0000ff">var</span> fileData = projectData.fileData;
    <span style="color:#0000ff">if</span>(fileData && fileData.length){
        fileData.<span style="color:#0000ff">forEach</span>(<span style="color:#0000ff">function</span>(file){
             <span style="color:#008000">//文件或文件夹路径</span>
             file.path = <span style="color:#a31515">'./'</span>+projectData.name +<span style="color:#a31515">'/'</span>+ file.name;
             <span style="color:#008000">//根据type类型创建文件或文件夹</span>
             file.content = file.content || <span style="color:#a31515">''</span>;

             <span style="color:#0000ff">switch</span>(file.type){
                 <span style="color:#0000ff">case</span> <span style="color:#a31515">'dir'</span>:
                     fs.mkdirSync(file.path);
                     <span style="color:#0000ff">break</span>;

                 <span style="color:#0000ff">case</span> <span style="color:#a31515">'file'</span>:
                     fs.writeFileSync(file.path,file.content);
                     <span style="color:#0000ff">break</span>;
                 <span style="color:#0000ff">default</span>:
                     <span style="color:#0000ff">break</span>;
             }

        });
    }

}</code></span></span>
           

2、自动打包多个文件

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#0000ff">var</span> fs = <span style="color:#0000ff">require</span>(<span style="color:#a31515">'fs'</span>);
<span style="color:#0000ff">var</span> filedir = <span style="color:#a31515">'./myProject/dist'</span>;

fs.exists(filedir,<span style="color:#0000ff">function</span>(isExists){
    <span style="color:#0000ff">if</span>(!isExists){
       fs.mkdirSync(filedir);
    }
    fs.watch(filedir,<span style="color:#0000ff">function</span>(ev,file){
        <span style="color:#008000">//只要有一个文件发生了变化,我们就需要对文件夹下的所有文件进行读取、合并</span>
        fs.readdir(filedir,<span style="color:#0000ff">function</span>(err,dataList){
            <span style="color:#0000ff">var</span> arr = [];
            dataList.<span style="color:#0000ff">forEach</span>(<span style="color:#0000ff">function</span>(file){
                <span style="color:#0000ff">if</span>(file){
                    <span style="color:#008000">//statSync查看文件属性</span>
                    <span style="color:#0000ff">var</span> info = fs.statSync(filedir + <span style="color:#a31515">'/'</span> +file);
                    <span style="color:#008000">//mode文件权限</span>
                    <span style="color:#0000ff">if</span>(info.mode === 33206){
                        arr.push(filedir + <span style="color:#a31515">'/'</span> +file);
                    }
                }
            });
            <span style="color:#008000">//读取数组中的文件内容</span>
            <span style="color:#0000ff">var</span> content = <span style="color:#a31515">''</span>;
            arr.<span style="color:#0000ff">forEach</span>(<span style="color:#0000ff">function</span>(file){
                <span style="color:#0000ff">var</span> c = fs.readFileSync(file);
                content += c.toString()+<span style="color:#a31515">'\n'</span>;
            });
           <span style="color:#008000">//合并文件中的内容</span>
           fs.writeFileSync(<span style="color:#a31515">'./myProject/js/index.js'</span>,content);

        })

    });
});
</code></span></span>
           

(7)使用node进行web开发

1、搭建一个http的服务器,用于处理用户发送的http请求

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#008000">//加载一个http模块</span>
<span style="color:#0000ff">var</span> http = <span style="color:#0000ff">require</span>(<span style="color:#a31515">'http'</span>);
<span style="color:#008000">//通过http模块下的createServer创建并返回一个web服务器对象</span>
<span style="color:#0000ff">var</span> server = http.createServer();
<span style="color:#008000">//开启 HTTP 服务器监听连接,只有调用了listen方法以后,服务器才开始工作</span>
server.listen(8000,<span style="color:#a31515">'localhost'</span>);
<span style="color:#008000">//服务器是否正在监听连接</span>
server.on(<span style="color:#a31515">'listening'</span>,<span style="color:#0000ff">function</span>(){
    <span style="color:#0000ff">console</span>.log(<span style="color:#a31515">"listening.........."</span>);
});
<span style="color:#008000">//每次接收到一个请求时触发,每个连接可能有多个请求(在 HTTP keep-alive 连接的情况下)。</span>
server.on(<span style="color:#a31515">'request'</span>,<span style="color:#0000ff">function</span>(){
     res.write(<span style="color:#a31515">'<p>hello</p>'</span>);
     res.end();
});</code></span></span>
           

2、request方法有两个参数:request、response

1)request:http.IncomingMessage的一个实例,获取请求的一些信息,如头信息,数据等

httpVession:使用的http协议的版本

headers:请求头信息中的数据

url:请求的地址

method:请求的方式

2)response:http.ServerResponse的一个实例,可以向请求的客户端输出返回响应

write(chunk,encoding):发送一个数据块到相应正文中

end(chunk,encoding):当所有的正文和头信息发送完成以后调用该方法告诉服务器数据已经全部发送完成了,这个方法在每次完成信息发送以后必须调用,并且是最后调用。

statusCode:该属性用来设置返回的状态码

setHeader(name,value):设置返回头信息

writeHead(statusCode,reasonPhrase,headers)这个方法只能在当前请求中使用一次,并且必须在response.end()之前调用

3、使用fs模块实现行为表现分离

<span style="color:#000000"><span style="color:#000000"><code><span style="color:#0000ff">var</span> http = <span style="color:#0000ff">require</span>(<span style="color:#a31515">'http'</span>);
<span style="color:#0000ff">var</span> url = <span style="color:#0000ff">require</span>(<span style="color:#a31515">'url'</span>);
<span style="color:#0000ff">var</span> fs = <span style="color:#0000ff">require</span>(<span style="color:#a31515">'fs'</span>);

<span style="color:#0000ff">var</span> server = http.createServer();
<span style="color:#008000">//html文件的路径</span>
<span style="color:#0000ff">var</span> htmlDir = __dirname + <span style="color:#a31515">'/html/'</span>;
server.on(<span style="color:#a31515">'request'</span>,<span style="color:#0000ff">function</span>(request,response){
    <span style="color:#0000ff">var</span> urlStr = url.parse(request.url);
    <span style="color:#008000">//根据pathname匹配对应的html文件</span>
    <span style="color:#0000ff">switch</span>(urlStr.pathname){
        <span style="color:#0000ff">case</span> <span style="color:#a31515">'/'</span>:
            sendData(htmlDir + <span style="color:#a31515">'index.html'</span>,request,response);
            <span style="color:#0000ff">break</span>;
        <span style="color:#0000ff">case</span> <span style="color:#a31515">'/user'</span>:
            sendData(htmlDir + <span style="color:#a31515">'user.html'</span>,request,response);
            <span style="color:#0000ff">break</span>;
        <span style="color:#0000ff">case</span> <span style="color:#a31515">'/login'</span>:
            sendData(htmlDir + <span style="color:#a31515">'login.html'</span>,request,response);
            <span style="color:#0000ff">break</span>;
        <span style="color:#0000ff">default</span>:
            <span style="color:#008000">//处理其他情况</span>
            sendData(htmlDir + <span style="color:#a31515">'err.html'</span>,request,response );
            <span style="color:#0000ff">break</span>;
    }
});

<span style="color:#0000ff">function</span> <span style="color:#a31515">sendData</span>(file,request,response){
    <span style="color:#008000">//读取文件,存在则返回对应读取的内容,不存在则返回错误信息</span>
    fs.readFile(file,<span style="color:#0000ff">function</span>(err,data){
        <span style="color:#0000ff">if</span>(err){
            response.writeHead(404,{
                <span style="color:#a31515">'content-type'</span>:<span style="color:#a31515">'text/html;charset=utf-8'</span>
            });
            response.end(<span style="color:#a31515">'<h1>页面不存在</h1>'</span>)
        }<span style="color:#0000ff">else</span>{
            response.writeHead(200,{
                <span style="color:#a31515">'content-type'</span>:<span style="color:#a31515">'text/html;charset=utf-8'</span>
            });
            response.end(data);
        }
    })
}
server.listen(8000,<span style="color:#a31515">'localhost'</span>);</code></span></span>
           

分类: Node