当前位置: 首页 > news >正文

Node.js 服务器

接收请求

我们的脚本只需要一个文件就可以搞定

  1. 新建一个安全的目录,不需要我重复强调吧?
    cd ~/Desktop; mkdir node-demo; cd node-demo
  2. touch server.js
  3. 编辑 server.js,内容我已经上传到 GitHub。
    curl https://raw.githubusercontent.com/FrankFang/nodejs-test/7f1a0ce15c47a6c2c938fe322f042e5d62bc7d01/server.js > server.js
    cat server.js
  4. 运行 node server 或者 node server.js,看到报错
  5. 根据报错提示调整你的命令
  6. 成功之后,这个 server 会保持运行,无法退出
    • 如果你想「中断」这个 server,按 <kb>Ctrl</kbd> + <kbd>C</kbd> 即可(C 就是 Cancel 的意思)
    • 中断后你才能输入其他命令
    • 我建议你把这个 server 放在那里别动,新开一个 Bash 窗口,完成下面的教程

好了服务器完成。只不过

  1. 这个服务器目前只有一个功能,那就是打印出路径和查询字符串
  2. 还缺少一个重要的功能,那就是发出 HTTP 响应

目前我们先只做一个功能玩玩。

接下来你要发起一个请求到这个服务器。这听起来有点怪异,「我向自己发起请求」,目前是的,因为你买不起服务器啊。

在新的 Bash 窗口运行 curl http://localhost:你的指定的端口/xxx 或者 curl http://127.0.0.1:你指定的端口/xxx

你会马上发现 server 打印出了路径:

  1. 这说明我们的 server 收到了我们用 curl 发出的请求
  2. 由于 server 迟迟没有发出响应,所以 curl 就一直等在那里,无法退出(用 <kb>Ctrl</kbd> + <kbd>C</kbd> 中断这个傻 curl)

发出响应

接下来我们让我们 server 发出响应

  1. 编辑 server.js
  2. 在中间我标注的区域添加两行代码
     response.write('Hi')
     response.end()
    复制代码
  3. 中断之前的 server,重新运行 node server 8888
  4. curl http://127.0.0.1:8888/xxx,结果如下:
     Hi%
    复制代码
    这个 % 不是我们的内容,% 表示结尾。别再问我了。如果你看 % 不爽,就把 'Hi' 换成 'Hi\n'。
  5. 好了,响应添加成功
  6. 使用 curl -s -v -- "http://localhost:8888/xxx" 可以查看完整的请求和响应(上节课的内容)

根据请求返回不同的响应

  1. 响应 /
  2. 响应 /xxx
  3. 响应 404
  4. 响应 /xxx.html
  5. 响应 /xxx.frank
  6. 再次强调,后缀是废话。文件内容是有 HTTP 头中的 Content-Type 保证的
  7. 响应 /xxx.css
  8. 响应 /xxx.js
  9. HTTP 路径不是文件路径!!!/xxx.html 不一定对应 xxx.html 文件
  10. HTTP 路径不是文件路径!!!/xxx.html 不一定对应 xxx.html 文件
  11. HTTP 路径不是文件路径!!!/xxx.html 不一定对应 xxx.html 文件

上传代码供以后复习

  1. 在 GitHub 创建新的空 repo,名称为 node-demo
  2. 按照 GitHub 的提示上传代码

这是完整的代码

var http = require('http')
var fs = require('fs')
var url = require('url')
var port = process.argv[2]

if(!port){
  console.log('请指定端口号好不啦?\nnode server.js 8888 这样不会吗?')
  process.exit(1)
}

var server = http.createServer(function(request, response){   
  var parsedUrl = url.parse(request.url, true)
  var path = request.url 
  var query = ''
  if(path.indexOf('?') >= 0){ query = path.substring(path.indexOf('?')) }
  var pathNoQuery = parsedUrl.pathname
  var queryObject = parsedUrl.query
  var method = request.method

  /******** 从这里开始看,上面不要看 ************/

  console.log('HTTP 路径为\n' + path)
  if(path == '/style.js'){
    response.setHeader('Content-Type', 'text/css; charset=utf-8')  //content-type:规定后面的内容类型,
                                                                   //utf-8:规定可以使用汉字
    response.write('body{background-color: #ddd;}h1{color: red;}')
    response.end()
  }else if(path == '/script.html'){
    response.setHeader('Content-Type', 'text/javascript; charset=utf-8')
    response.write('alert("这是JS执行的")')
    response.end()
  }else if(path == '/index.css'){
    response.setHeader('Content-Type', 'text/html; charset=utf-8')
    response.write('<!DOCTYPE>\n<html>'  + 
      '<head><link rel="stylesheet" href="/style.js">' +
      '</head><body>'  +
      '<h1>你好</h1>' +
      '<script src="/script.html"></script>' +
      '</body></html>')
    response.end()
  }else{
    response.statusCode = 404
    response.end()
  }

  /******** 代码结束,下面不要看 ************/
})

server.listen(port)
console.log('监听 ' + port + ' 成功\n请用在空中转体720度然后用电饭煲打开 http://localhost:' + port)
复制代码


相关文章:

  • 五分钟搞清楚MySQL事务隔离级别
  • 小程序客服消息
  • JAVA枚举在Annotation中的应用
  • 给github项目添加CI badge
  • 物联网操作系统已现中国时机
  • selenium+Python之select定位
  • 一个简单的Golang实现的HTTP Proxy
  • springMVC
  • 将Python程序打包为exe方法
  • Impdp导入时报错:ORA-39006,ORA-39213
  • 专访朱诗雄:Apache Spark中的全新流式引擎Structured Streaming
  • nagios
  • 开发App没有数据源?不存在的!国内值得关注的API集合
  • 2015携程JAVA工程师笔试题(基础却又没多少人做对的面向对象面试题)
  • JavaScript服务器推送技术之 WebSocket
  • __proto__ 和 prototype的关系
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • CentOS从零开始部署Nodejs项目
  • ES2017异步函数现已正式可用
  • java取消线程实例
  • Shadow DOM 内部构造及如何构建独立组件
  • SpringBoot几种定时任务的实现方式
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vue-router的history模式发布配置
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 实现简单的正则表达式引擎
  • 收藏好这篇,别再只说“数据劫持”了
  • 手机端车牌号码键盘的vue组件
  • 算法---两个栈实现一个队列
  • 以太坊客户端Geth命令参数详解
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 从如何停掉 Promise 链说起
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #NOIP 2014#Day.2 T3 解方程
  • (ibm)Java 语言的 XPath API
  • (第27天)Oracle 数据泵转换分区表
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (转)LINQ之路
  • (转)创业家杂志:UCWEB天使第一步
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net 调用php,php 调用.net com组件 --
  • /proc/stat文件详解(翻译)
  • [ C++ ] STL---stack与queue
  • [20150321]索引空块的问题.txt
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [autojs]autojs开关按钮的简单使用
  • [bzoj 3124][sdoi 2013 省选] 直径
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [codeforces] 25E Test || hash
  • [codeforces]Recover the String
  • [E链表] lc83. 删除排序链表中的重复元素(单链表+模拟)
  • [GDOUCTF 2023]<ez_ze> SSTI 过滤数字 大括号{等
  • [IE编程] IE中使网页元素进入编辑模式