工具安装
安装工具 ts-node-dev
这个工具可以用TypeScript开发Node.js程序,且会自动重启,但是不宜在生产环境使用,但非常适合用来学习
yarn global add ts-node-dev
curl命令
// GET请求
curl -v url
// POST 请求
curl -v -d "name=ade" http://localhost:8888/
构建项目
- yarn init -y
- 新建index.ts
- 使用命令行或者WebStorm启动
- yarn add —dev @types/node安装node声明文件
- 引入http模块(WebStorm 自动导入)
- 用http创建server (WebStorm 自动命名)
- 监听server的request事件(可以简写)
- server.listen(8888)开始监听8888端口
- 使用
curl -V http://localhost:8888
发请求
启动应用
ts-node-dev index.ts
server是什么
首先我们查看中文文档](http://nodejs.cn/api/http.html#http_class_http_server))
http.createServer([options][, requestListener])
在文档中可以发现server是http.Server
类的实例同时继承了 net.Server
类,它返回新的: <http.Server>
实例。
在option
里面有IncomingMessage
和ServerResponse
比较重要的类。
IncomingMessage
对象由 http.Server
或 http.ClientRequest
创建,并分别作为第一个参数传给 ‘request’ 和 ‘response’ 事件。 它可用于访问响应状态、消息头、以及数据。
ServerResponse
此对象由 HTTP 服务器在内部创建,而不是由用户创建。 它会作为第二个参数传给 ‘request’ 事件。
在serve中使用较多的有
server.listen()
:启动 HTTP 服务器用于监听连接。
server.listen(7777); // 监听7777端口
在net.Server
类中有几个使用较多的事件
‘error’ 事件:当错误出现的时候触发。,’close’ 事件不会在这个事件触发后继续触发,除非 server.close()
是手动调用。
GET请求
- request.method获取请求动词
- request.url获取请求路径(含 查询参数)
- request.header获取请求头
- get请求一般没有消息体/请求体
POST请求
data 和 end 事件继承自 stream.Readable
类,相关文档
request.on(‘data’ ,fn)获取消息体,当流将数据块传送给消费者后触发。
const readable = getReadableStreamSomehow();
readable.on('data', (chunk) => {
console.log(`接收到 ${chunk.length} 个字节的数据`);
});
request.on(‘end’ ,fn) 拼接消息体,当流中没有数据可供消费时触发。
const readable = getReadableStreamSomehow();
readable.on('data', (chunk) => {
console.log(`接收到 ${chunk.length} 个字节的数据`);
});
readable.on('end', () => {
console.log('已没有数据');
});
request,response 是什么
request是http.IncomingMessage的实例,它可用于访问响应状态、消息头、以及数据,,通俗讲就是请求的所有信息。
根据文档
拥有headers、method、 url等 属性
// 请求头
request.headers()
// 请求的方式
request.method()
// 请求的路径
request.url()
从stream.Readable类继承了data/end/error 事件
response是http.ServerResponse的实例,通俗讲就是响应的所有信息。
根据文档
拥有getHeader/setHeader/end/write等方法
// 此属性控制在刷新响应头时将发送到客户端的状态码。
response.statusCode = 404;
// 为隐式响应头设置单个响应头的值。
response.setHeader('Content-Type', 'text/html');
//这会发送一块响应主体。 可以多次调用该方法以提供连续的响应主体片段。
response.write()
//此方法向服务器发出信号,表明已发送所有响应头和主体,该服务器应该视为此消息已完成。 必须在每个响应上调用此 response.end() 方法。
response.end('xxx');
拥有statusCode属性,可读可写
继承了Stream,目前用不上
小小实战
匹配任意文件
// 获取路径名
const {pathname, search} = url.parse(path);
let fileName = pathname.substr(1);
// 将相对路径解析为绝对路径,获取文件
fs.readFile(p.resolve(publicDir, fileName), ()=>{})
设置首页
let fileName = pathname.substr(1);
if (fileName === '') {
fileName = 'index.html';
}
非GET请求设置
if (method !== 'GET') {
response.statusCode = 405;
response.end();
return;
}
设置缓存
Cache-Control
通用消息头字段,被用于在http请求和响应中,通过指定指令来实现缓存机制。
MDN相关文档
response.setHeader('Cache-Control', 'public, max-age=31536000');
response.end(data);