node.js的初步学习

[复制链接]
发表于 昨天 09:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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 方法转成能读的字符:
  1. fs.readFile('./hello.tex',function(error,date){
  2.     // 默认存储的是2进制,然后转化为16进制
  3.   //  <Buffer 68 65 6c 6c 6f 2c 77 6f 72 6c 64 21 21 21>
  4.   //  通过toString方法把其转化为认识的字符
  5.     console.log(date);
  6.    console.log(date.toString());
复制代码

判断读没读成功,就看 error 有没有值:
  1. // 注释:通过判断 error 是否存在,确认文件读取是否出错
复制代码
  1. if (error) {
  2.   // 如果 error 有值(说明读取失败),打印错误提示
  3.   console.log('读取文件失败了')
  4. } else {
  5.   // 如果 error 为 null(说明读取成功),打印文件内容(data 是文件内容的 Buffer/字符串)
  6.   console.log(data.toString())
  7. }
  8. })
复制代码

写文件:writeFile 的参数顺序

写文件同样是三个参数,别记混顺序:


  • 第一个参数是文件路径,第二个参数是文件内容,第三个参数是回调函数
  • error 的规律和读文件一样:成功时 error 就是 null,说明文件写进去了;失败时 error 就是错误对象

  1. var fs=require('fs')
  2. fs.writeFile('./你好.md','大家好,我是node',function(error){
  3.      console.log('成功')
  4. })
复制代码

http 模块:三行代码起一个服务器

http 是 Node 的核心模块,作用就是帮你创建和编写服务器,流程拆开看很清楚:


  • 加载 http 模块:var http=require('http')
  • 用 http.createServer() 方法创建 Web 服务器,返回一个 Server 实例


创建实例就这一行:
  1. var server=http.createServer();
复制代码

服务要跑起来,得走完四步:发请求、接受请求、处理请求、给出反馈(发送响应)。当客户端发请求过来,会自动触发 request 事件,接着执行 createServer 的第二个参数——那个回调函数:
  1. server.on('request',function(){
  2. console.log('收到请求')
  3. })
复制代码

最后绑定端口号启动服务器:
  1. server.listen(3000,function(){
  2.     console.log('启动成功,通过http://127.0.0.1:3000/访问')
  3. })
复制代码

request 与 response 两个对象

request 是请求事件处理函数,接收两个参数:


  • request 请求对象:用来获取客户端的一些请求信息,比如请求路径
  • response 响应对象:用来给客户端发送响应消息


response 对象有个 write 方法,可以给客户端发送数据。write 能调用多次,但最后一定要用 end 来结束响应,否则客户端会一直等着。
  1. var http=require('http');
  2. var server=http.createServer();
  3. server.on('request',function(request,response){
  4. console.log('收到请求,请求路径为'+request.url)
  5. response.write('hello')
  6. response.write('node')
  7. response.end()
  8. })
  9. server.listen(3000,function(){
  10.     console.log('启动成功,通过http://127.0.0.1:3000/访问')
  11. })
复制代码

按 url 路径返回不同响应

实际开发里,要根据不同的请求路径返回不同的响应结果。用 request.url 能拿到端口后面那一段路径,也就是说所有 url 都以 / 开头,然后据此做判断分发:
  1. var http=require('http')
  2. var server=http.createServer()
  3. server.on('request',function(request,response){
  4. console.log(request.url)
  5. // response.end('hello,node')
  6. // response.write('hello')
  7. // response.write('node')
  8. // response.end()
  9. var url=request.url
  10. if(url==='/'){
  11.     response.end('index paga')
  12. }else if(url==='/login'){
  13.     response.end('login paga')
  14. }else if(url==='/products'){
  15.     // 设置响应头:明确使用 UTF-8 编码的 JSON
  16.     response.setHeader('Content-Type', 'application/json; charset=utf-8');
  17.     var products=[
  18.         {
  19.         name:'苹果',
  20.         price:888,
  21.         } ,{
  22.         name:'荔枝',
  23.         price:9999,
  24.         }
  25.     ]
  26.       response.end(JSON.stringify(products))
  27. }else{
  28.      response.end('404')
  29. }
  30. })
  31. server.listen(80,function(){
  32.     console.log('...')
  33. })
复制代码

注意 listen 绑定的是 80 端口,本地想避开权限问题可以换成 3000;上面 products 分支记得补上 response.setHeader,不然中文会乱码。

初学阶段先把 fs 的 error 分支和 response.end 这两个点吃透,后面 Express 那些框架基本都是在这套机制外面包一层。

编辑提示:跟着本文敲一遍代码最快——先跑通一个 listen(3000) 的服务器,再用 fs.readFile 读一个本地 txt,两个都出结果了,Node 的异步回调思路也就顺了。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表