如果我们使用 PHP 来编写后端的代码时,需要 Apache 或者 Nginx 的 HTTP 服务器,并配上 mod_php5 模块和 php-cgi。 从这个角度看,整个”接收 HTTP 请求并提供 Web 页面”的需求就不需要 PHP 来处理。 不过对 Node.js 来说,概念完全不一样了。使用 Node.js 时,我们不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器。事实上,我们的 Web 应用以及对应的 Web 服务器基本上是一样的。 在我们创建 Node.js 第一个 “Hello, World!” 应用前,让我们先了解下 Node.js 应用是由哪几部分组成的:
- 引入 required 模块:我们可以使用 require 指令来载入 Node.js 模块。
- 创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。
- 接收请求与响应请求 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据
创建 Node.js 应用
一、引入http 模块
我们使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http,实例如下:
var http = require("http")
二、创建服务器
接下来我们使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 8888 端口。 函数通过 request, response 参数来接收和响应数据。
实例如下,在你项目的根目录下创建一个叫 server.js 的文件,并写入以下代码:
var http = require("http")http.createServer(function (request, response) {response.writeHead(200, { "Content-Type": "text/plain" }) // 发送HTTP头部, HTTP状态值:200 内容类型:text/plainresponse.end("Hello World\n") // 发送响应数据 "Hello World"}).listen(8888)console.log("Server running at http://127.0.0.1:8888/")
以上代码我们完成了一个可以工作的 HTTP 服务器
使用 node 命令执行以上的代码:
node server.jsServer running at http://127.0.0.1:8888/
接下来我们通过 Gif 图为大家演示实例操作:
实现一个静态http服务器
const http = require("http");const fs = require("fs")http.createServer(function (req, res) {// 打开 www/ 目录下的文件fs.readFile("./www/" + req.url, function (err, data) {if (err) {console.log(err);res.write("404");res.end();} else {console.log(data.toString())res.write(data);res.end();}})}).listen(8080)
const http = require("http");const fs = require("fs");const querystring = require("querystring");/**1. 访问www内的静态资源*2. 解析get请求, 并保存到serverLog.txt*3. 解析post请求serverLog.txt*/// 获取当前时间function getNowDate() {let dt = new Date();let year = dt.getFullYear();let month = dt.getMonth();let day = dt.getDate();// 将月份加1month = month + 1;// 将月份补齐到两位if (month <= 9) {month = "0" + month;}// 将日补齐到两位if (day <= 9) {day = "0" + day;}let hour = dt.getHours();let minutes = dt.getMinutes();let seconds = dt.getSeconds();return year + "-" + month + "-" + day + "-" + hour + "-" + minutes + "-" + seconds;}http.createServer(function (req, res) {// 1. 尝试访问www下的静态资源fs.readFile("./www" + req.url, function (err, data) {if (err) {//2. 解析请求的参数, 并保存到logif (req.method === "GET") {console.log("收到了GET请求")let getData = querystring.parse(req.url.split("?")[1]);console.log("获得的get数据为==>", getData);fs.writeFile("./serverLog.txt", getNowDate() + "\n" + JSON.stringify(getData) + "\n", { flag: 'a' }, function (err) {if (err) {console.log(err);console.log("GET数据保存至log出错");}});} else if (req.method == "POST") {console.log("收到了POST请求")let tmpData = ''req.on("data", function (data) {tmpData += data;});req.on("end", function () {let postData = querystring.parse(tmpData);console.log("获得的post数据为==>", postData);fs.writeFile("./serverLog.txt", getNowDate() + "\n" + JSON.stringify(postData) + "\n", { flag: 'a' }, function (err) {if (err) {console.log(err);console.log("POST数据保存至log出错");}});})}res.write("404");res.end();} else {res.write(data);res.end();}})}).listen(8000)
var http = require("http")var fs = require("fs")var path = require("path")//创建服务http.createServer(function (req, res) {var html = fs.readFileSync(path.join(__dirname, "/main.html"))// res.writeHead(200, {'Content-Type': 'text/plain'}) //普通文本res.writeHead(200, { "Content-Type": "text/html" }) //html文本// res.setHeader("Content-Type", "text/html")// res.setHeader("Set-Cookie", ["type=ninja", "language=javascript"])res.write(html)res.end()}).listen("7890", function (err) {if (err) {console.log(err)throw err}console.log("服务器已开启。端口号为:7890")})console.log("Server running at http://127.0.0.1:7890/")
var http = require("http")var fs = require("fs")var url = require("url")http.createServer(function (req, res) {var hostname = req.headers.host //获取requset信息中的host地址var pathname = url.parse(req.url).pathname //获取pathnameif (pathname === "/") {//判断是否为域名地址(简单路由)readFileAndResponse("/index.html", res)}}).listen(7890)function readFileAndResponse(pathname, response) {fs.readFile(pathname.substr(1), "", function (err, data) {if (err) {//文件不存在或读取错误返回404,并打印page not foundresponse.writeHead(404)response.end("page not found")} else {response.end(data) //读取成功返回相应页面信息}})}console.log("Server running at http://127.0.0.1:7890/")
var https = require('https')var option = {hostname: 'm.baidu.com',path: '/tcx?appui=alaxs&page=api/chapterList&gid=4315647048&pageNum=1&chapter_order=asc&site=&saveContent=1',headers: {'Accept': '*/*','Accept-Encoding': 'utf-8', //这里设置返回的编码方式 设置其他的会是乱码'Accept-Language': 'zh-CN,zhq=0.8','Connection': 'keep-alive','Cookie': 'BAIDUID=A78C39414751FF9349AAFB0FDA505058:FG=1 true __bsi=12248088537049104479_00_7_N_R_33_0303_cca8_Y','Host': 'm.baidu.com','Referer': 'https://m.baidu.com/tcx?appui=alaxs&page=detail&gid=4305265392&from=dushu'}}https.get(option, function (res) {var chunks = []res.on('data', function (chunk) {chunks.push(chunk)})res.on('end', function () {console.log(Buffer.concat(chunks).toString())})})
fs模块读写文件
const fs = require("fs");// 写入文件fs.writeFile("HelloWorld.txt", "HelloWorld HelloNode", function (err) {if (err) {console.log(err);}// 读取刚刚写入的数据else {fs.readFile("HelloWorld.txt", function (err, data) {if (err) {console.log(err);} else {console.log(data.toString());}})}})
