剧场模式
首页后端Nodejs轻松学 nodejs - 基础篇

轻松学 Node.js - 基础篇 #11 web 服务器 part 3 响应 HTML 页面

求知小风 · 真仙发布于
6

var http = require('http');
var fs = require('fs');

var onRequest = function(request, response) {
    console.log('Request received');
    response.writeHead(200, { 'Content-Type': 'text/html' });
    var myReadStream = fs.createReadStream(__dirname + '/index.html', 'utf8');
    // response.write('Hello from out application');
    myReadStream.pipe(response);
}

var server = http.createServer(onRequest);

server.listen(3000, '127.0.0.1');
console.log('Server started on localhost port 3000');

html 字符串

'<!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>Document</title>' +
'</head>' +

'<body>' +

'</body>' +

'</html>'

index.html

<!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>hfpp2012</title>
</head>

<body>
    hello wolrd
</body>

</html>
7 条回复
  • 废菜 · 练虚
    废菜 · 练虚 #1

    页面的图标是怎么弄的啊?

  • 海外散仙厉飞雨 · 元婴

    哪个图标 没明白所问哦

  • 废菜 · 练虚
    废菜 · 练虚 #3

    就是favicon.ico,我放了一个同名图片进来没用。。

  • 海外散仙厉飞雨 · 元婴

    继续往下看,再看到 express 可能就有些明白。

  • huang-guanhua · 元婴

    代码中为什么用管道方法,就不需要response.end()了吗

  • LY🧢🧥👖🥾 · 元婴

    同问!!!!

  • hacker0limbo · 元婴

    首先搞清楚一些概念: myReadStream 是一个可读流, response 是一个可写流(继承自 http.ServerResponse), 使pipe 把一个可读流的输出连接到了一个可写流的输入

    其次, 对于可写流, 查看官方文档, 可以看到以下事件和方法:

    1. writable.write(chunk[, encoding][, callback])
    2. writable.end([chunk[, encoding]][, callback])

    个人理解, 上面使用的 pip 方法, 实际等价于下面代码:

    // 原始代码
    myReadStream.pipe(response);
    
    // 等价于使用下面的方法:
    myReadStream.on('data', (chunk) => {
      response.write(chunk);
    });
    
    myReadStream.on('end', () => {
      response.end();
    });
    

    所以实际上使用了 pipe() 已经完成了write()end 方法, 再次调用 response,end() 显的多次一举.

    同时, 官方文档对于writable.end([chunk[, encoding]][, callback])也说了:

    调用 writable.end() 表明已没有数据要被写入可写流。 可选的 chunk 和 encoding 参数可以在关闭流之前再写入一块数据。 如果传入了 callback 函数,则会做为监听器添加到 'finish' 事件。

    一目了然, 这也是为什么视频里面会报: The first argument must be be one of type of String or Buffer, pipe 方法会最后会返回一个流, 明显不是 String 或者 Buffer 类型, 自然出错

    想要知道更多关于流和 http 模块的介绍, 我推荐阅读下面三篇文章:

    1. https://itbilu.com/nodejs/core/N1okQ7Eh.html
    2. https://itbilu.com/nodejs/core/4y3SPWbS.html
    3. https://juejin.im/post/5940a9c3128fe1006a0ab176

    当然, 官网是最好的资料, 虽然我知道很多时候不是非常详细:

    1. http 模块

    以上均是个人查阅资料之后的理解, 若有错误随风前辈也请赶紧指正, 欢迎讨论 :)

加微信(qiuzhi99666)入群官方服务号
随机课程
GraphQL + React + React Router + Apollo 实战教程

GraphQL + React + React Router + Apollo 实战教程

10 个视频1 小时 12 分钟初级

Pro¥ 149.00¥ 119.20

GraphQL已完结新课程

学员(98)
SunYJ · 元婴冀宇航 · 真仙daixixi · 元婴YehanZhou · 元婴wangyinwei1 · 真仙zev91 · 练虚p-m-ing · 道祖张小普vip · 元婴sneve 🍉 · 化神穆博嘉 · 真仙YanXinhua · 道祖遇见 · 化神
最新动态
SunYJ · 元婴学习到了3:46
冀宇航 · 真仙学习到了4:18
daixixi · 元婴学习到了4:18
YehanZhou · 元婴学习到了4:18
wangyinwei1 · 真仙学习到了4:03
统计信息
    学员: 15217
    视频数量: 878
    帖子数量: 433

© 汕尾市求知科技有限公司 | 粤ICP备19038915号 | 在线学员:133

Top