使用node构建一个web服务器
在node中提供了一个核心模块 http ,这个模块的是用来编写服务器的
这是最简单的http服务
//1、加载http模块
var http = require('http')
//2、使用http.createServer()方法创建一个web服务器,方法返回值是一个Server实例
var server = http.createServer()
//3、注册request事件,当客户端发起请求,自动触发request事件,然后执行回调函数
server.on('request', function() {
console.log("收到了客户端的请求")
})
//4、绑定端口号,启动服务器
server.listen(3000, function() {
console.log("服务器启动成功,可以通过localhsot:3000来进行访问")
})
在浏览器输入网址,会给出回应(要先打开apache服务)
给客户端发送响应数据
//回调函数包含两个参数:request和response
//request请求对象,可以用来获取客户端的一些请求信息,例如请求路径
//response相应对象,可以用来给客户端发送响应消息
//response有一个write函数,可以给客户端发送响应数据。write可以使用多次,但最后一定要使用end结束响应,否则客户端会一直等待
server.on('request', function(request, response) {
console.log("收到了客户端的请求,请求路径是:", request.url)
response.write('Hello World!')
response.write('Hello Node.js!')
response.end()
})
一般不推荐上面的那种写法,可以直接在end中返回相应内容
response.end('hello World')
根据不同请求路径发送不同的相应结果
//加载模块
var http = require('http')
//创建web服务器
var server = http.createServer()
//注册request事件
server.on('request', function(request, response) {
var url = request.url
response.setHeader('Content-Type', 'text/palin; charset=utf-8'); //解决中文乱码
if (url === '/') {
response.end('这里是首页')
} else if (url === '/login') {
response.end('这里是登录页面')
} else {
response.end('404 Not Found the page')
}
})
//注册端口号
server.listen('3000', function() {
console.log('服务器启动成功,可以通过localhost:3000进行访问')
})
注: response.url
是端口号后面的那一部分路径,也就是说url都是以/
开头
中文乱码的原因:服务器默认发送的数据,采用utf8编码,但是浏览器不知道你是utf8编码,所以会按照当前操作系统的默认编码去解析
响应json数据
在请求接口时一般服务器都会返回一个json数据,但是服务器返回数据的内容只能说字符串或者二进制数
var info = [{
name: '张三',
age: 15,
phoone: 15066666666
}]
if (url === '/login') {
response.end(JSON.stringify(info))
}
可以使用JSON.stringify()
将数组转换为json字符串
响应html
home.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h1>这里是首页</h1>
<p>这是服务器响应的html页面</p>
</body>
</html>
服务器代码
//加载模块
var fs = require('fs')
var http = require('http')
//创建server实例
var server = http.createServer()
//注册request事件
server.on('request', function(request, response) {
var url = request.url
response.setHeader('Content-Type', 'text/html; charset=utf-8');
if (url === '/') {
fs.readFile('./home.html', function(err, data) {
if (err) {
response.end('访问失败,请稍后重试')
} else {
response.end(data)
}
})
}
})
//绑定端口号
server.listen(3000, function() {
console.log('服务器启动成功,可以通过localhost:3000进行访问')
})
响应图片
server.on('request', function(request, response) {
var url = request.url
response.setHeader('Content-Type', 'image/jpeg;');
if (url === '/') {
fs.readFile('./abc.jpg', function(err, data) {
if (err) {
response.end('访问失败,请稍后重试')
} else {
response.end(data)
}
})
}
})
注:加载图片是就不需要指定编码,只需要指定格式即可
仿apache实现文件或页面的加载显示
准备:建一个www目录,将要显示的文件或页面,放到该目录下
实现代码
//加载模块
var http = require('http')
var fs = require('fs')
//创建服务
var server = http.createServer()
//www目录,方便www目录移动后的修改
var wwwDir = 'D:/MyWorkSpace/node/d2/www'
//监听响应
server.on('request', function(request, response) {
var url = request.url;
var filePath = '/index.html'
if (url !== '/') {
filePath = url
}
fs.readFile(wwwDir + filePath, function(err, data) {
if (err) {
return response.end('404 Not Find the page')
} else {
response.end(data)
}
})
})
//注册端口号
server.listen(5000, function() {
console.log('Server is running .....')
})
注:文件路径分隔符必须是/
,不能是\
,否则会报错
基本流程的简写
//加载模块
var http = require('http')
var fs = require('fs')
//流程格式
http.createServer(function(request, response) {
}).listen(3000, function() {
})
服务端关于静态文件的处理
目录约定:关于一些静态资源同一放到public目录下
--public
------css 存放css样式文件
------js 存放一些JavaScript代码
------image 存放一些图片
------lib 存放第三方的资源文件
等
处理:当请求路径是public开头时,文件直接进行读取
home.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h1>首页</h1>
<img src="/public/image/abc.jpg" >
</body>
</html>
服务器文件
var http = require('http')
var fs = require('fs')
http.createServer(function(request, response) {
var url = request.url
if (url === '/') {
fs.readFile('./home.html', function(err, data) {
if (err) {
response.end('404')
console.log(err)
} else {
response.end(data)
}
})
} else if (url.indexOf('/public/') === 0) {
fs.readFile('.' + url, function(err, data) { //必须加点,不然会造成路径访问错误
if (err) {
response.end('404')
} else {
response.end(data)
}
})
}
}).listen(5000, function() {
console.log('server is running ....')
})
这样前端页面中使用到的资源可以直接从服务器里进行读取,不需要读取本地的文件
注意: 在服务器端中,文件中的路径就不要去写相对路径,因为这个时候所有的资源都是通过url标识来获取的,我的服务器开放了/public/
目录,所有请求路径都要写出:/public/xxx