马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
Node.js 到底是什么,它跟 JavaScript 又是什么关系?简单说,Node.js 给 JavaScript 提供了一个能跑在服务器端的运行环境:JavaScript 当后端语言,就得跑在 Node.js 上;当前端语言,就跑在浏览器里。本文接着往下讲 Node.js 能干什么,再把文件读写、http 服务器、url 路由这三块最常用的能力,用可复制的代码一段段跑给你看。
Node.js 到底能拿来做什么
Node.js 作为 JavaScript 的运行环境,提供了一批基础功能和 API,基于它衍生出了不少框架:
- Express 框架(快速构建 web 应用)
- Electron 框架(快速构建跨平台的桌面应用)
- restify 框架(快速构建 API 接口项目)
- 读写数据库,创建实用的命令行工具辅助前端开发
读文件:fs 核心模块怎么用
浏览器里的 JS 没有操作文件的能力,Node 中的 JS 才有。fs 是 FileSystem 的简写,意思就是文件系统;在 Node 里做文件操作必须引入 fs 核心模块,这个模块提供了全部文件操作相关的 API。
先看 fs.readFile 的用法,分三步走:
- 用 require 方法加载 fs 核心模块
- 读取文件:第一个参数是文件路径,第二个参数是回调函数
- 看 error 和 data 两个回调参数:读取失败时 error 是错误对象、data 是 undefined(没数据);读取成功时 error 是 null、data 是读到的内容
完整写法如下,readFile 读到的内容默认是二进制再转十六进制的形式,靠 toString 方法转成能读的字符:
- fs.readFile('./hello.tex',function(error,date){
- // 默认存储的是2进制,然后转化为16进制
- // <Buffer 68 65 6c 6c 6f 2c 77 6f 72 6c 64 21 21 21>
- // 通过toString方法把其转化为认识的字符
- console.log(date);
- console.log(date.toString());
复制代码
判断读没读成功,就看 error 有没有值:
- // 注释:通过判断 error 是否存在,确认文件读取是否出错
复制代码- if (error) {
- // 如果 error 有值(说明读取失败),打印错误提示
- console.log('读取文件失败了')
- } else {
- // 如果 error 为 null(说明读取成功),打印文件内容(data 是文件内容的 Buffer/字符串)
- console.log(data.toString())
- }
- })
复制代码
写文件:writeFile 的参数顺序
写文件同样是三个参数,别记混顺序:
- 第一个参数是文件路径,第二个参数是文件内容,第三个参数是回调函数
- error 的规律和读文件一样:成功时 error 就是 null,说明文件写进去了;失败时 error 就是错误对象
- var fs=require('fs')
- fs.writeFile('./你好.md','大家好,我是node',function(error){
- console.log('成功')
- })
复制代码
http 模块:三行代码起一个服务器
http 是 Node 的核心模块,作用就是帮你创建和编写服务器,流程拆开看很清楚:
- 加载 http 模块:var http=require('http')
- 用 http.createServer() 方法创建 Web 服务器,返回一个 Server 实例
创建实例就这一行:
- var server=http.createServer();
复制代码
服务要跑起来,得走完四步:发请求、接受请求、处理请求、给出反馈(发送响应)。当客户端发请求过来,会自动触发 request 事件,接着执行 createServer 的第二个参数——那个回调函数:
- server.on('request',function(){
- console.log('收到请求')
- })
复制代码
最后绑定端口号启动服务器:
- server.listen(3000,function(){
- console.log('启动成功,通过http://127.0.0.1:3000/访问')
- })
复制代码
request 与 response 两个对象
request 是请求事件处理函数,接收两个参数:
- request 请求对象:用来获取客户端的一些请求信息,比如请求路径
- response 响应对象:用来给客户端发送响应消息
response 对象有个 write 方法,可以给客户端发送数据。write 能调用多次,但最后一定要用 end 来结束响应,否则客户端会一直等着。
- var http=require('http');
- var server=http.createServer();
- server.on('request',function(request,response){
- console.log('收到请求,请求路径为'+request.url)
- response.write('hello')
- response.write('node')
- response.end()
- })
- server.listen(3000,function(){
- console.log('启动成功,通过http://127.0.0.1:3000/访问')
- })
复制代码
按 url 路径返回不同响应
实际开发里,要根据不同的请求路径返回不同的响应结果。用 request.url 能拿到端口后面那一段路径,也就是说所有 url 都以 / 开头,然后据此做判断分发:
- var http=require('http')
- var server=http.createServer()
- server.on('request',function(request,response){
- console.log(request.url)
- // response.end('hello,node')
- // response.write('hello')
- // response.write('node')
- // response.end()
- var url=request.url
- if(url==='/'){
- response.end('index paga')
- }else if(url==='/login'){
- response.end('login paga')
- }else if(url==='/products'){
- // 设置响应头:明确使用 UTF-8 编码的 JSON
- response.setHeader('Content-Type', 'application/json; charset=utf-8');
- var products=[
- {
- name:'苹果',
- price:888,
- } ,{
- name:'荔枝',
- price:9999,
- }
- ]
- response.end(JSON.stringify(products))
- }else{
- response.end('404')
- }
- })
- server.listen(80,function(){
- console.log('...')
- })
复制代码
注意 listen 绑定的是 80 端口,本地想避开权限问题可以换成 3000;上面 products 分支记得补上 response.setHeader,不然中文会乱码。
初学阶段先把 fs 的 error 分支和 response.end 这两个点吃透,后面 Express 那些框架基本都是在这套机制外面包一层。
编辑提示:跟着本文敲一遍代码最快——先跑通一个 listen(3000) 的服务器,再用 fs.readFile 读一个本地 txt,两个都出结果了,Node 的异步回调思路也就顺了。
|