创建应用
引入模块
var http = require('http')
创建服务器
http.createServer(function (request, response){
response.writeHead(200, {'content-Type': 'text/plain'})
response.end('Hello woo')
}).listen(8888)
回调函数
同步,阻塞代码
var fs = require("fs")
// 读取文件内容
var data = fs.readFileSync("input.txt")
console.log(data.toString())
console.log('jieshu')
非阻塞代码
var fs = require("fs")
fs.readFile('input.txt', function(err, data){
if(err) return console.log(err)
console.log(data.toString())
})
console.log('end')
事件
var events = require('events')
var eventEmitter = new events.EventEmitter()
// 事件处理程序
var connectHandler = function connected(){
console.log('连接成功')
//触发data_received事件
eventEmitter.emit('data_received')
}
// 绑定connection事件处理程序
eventEmitter.on('connection', connectHandler)
// 绑定data_received事件
eventEmitter.on('data_received', function(){
console.log('数据接收成功')
})
// 触发connection事件
eventEmitter.emit('connection')
console.log('end')
- EventEmitter类:事件触发+事件监听
var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();
// event.on在event对象上注册事件someEvent的监听器,可以注册多个监听器,事件触发时监听器会被依次调用
event.on('someEvent', function(arg1, arg2){
//...
})
// event.emit向event对象发送事件someEvent,调用someEvent的监听器
event.emit('someEvent','arg1','arg2')
.addListener(event, listener)
.on(event, listener)
.once(event, listener)
.emit(event, [arg1],[arg2],[…])
.removeListener(event, listener)
.removeAllListeners([event])
.setMaxListeners(n)
.listeners(event)
.listenerCount(eventName) 返回指定事件的监听器数量
var eventListeners = eventEmitter.listenerCount(‘connection’)
Buffer
javascript本身只有字符串数据类型,没有二进制数据类型。但是在处理像TCP流或文件流的时候必须使用二进制数据,因此Nodejs定义了一个Buffer类,创建了一个专门放二进制数据的缓存区。
- Buffer类相关API
Buffer.alloc() Buffer.from(array) Buffer.from(arrayBuffer, byteOffset,
length) Buffer.frm(buffer) .write(string, offset, length, encoding)
.toString(encoding, start, end) .concat(list, totalLength)
.compare(otherBuffer) .copy(targetBuffer, targetStart, sourceBuffer,
sourceEnd) .slice(start, end) .length
ps:后面学到响应与请求的时候会有一个response.end()
方法,该方法接收的参数类型只能是字符串或者Buffer,所以对于传入的json数据,需要先用JSON.stringify
进行处理将json对象处理为字符串
Stream流
- 处理事件流:data——>end——>error
从流中读取数据
var fs = require("fs")
var data = ''
// 创建一个可读流
var readerStream = fs.createReadStream('input.txt')
readerStream.setEncoding('UTF8')
// 没有数据可读的时候触发
readerStream.on('data', function(chunk){
console.log('start')
data += chunk
})
readerStream.on('end', function(){
console.log(data)
})
readerStream.on('error', function(err){
console.log(err.stack)
})
console.log('end!')
// 输出:end! start Hello,woo!(input.txt中的内容)
写入流
var fs = require('fs')
var data = 'helloooo, woo!'
// 创建一个可写流
var writerStream = fs.createWriteStream('output.txt')
writerStream.write(data, 'UTF8')
// 关闭数据流
writerStream.end()
writerStream.on('finish', function(){
console.log('写入完成')
})
writerStream.on('error', function(err){
console.log(err.stack)
})
console.log('end')
管道流:从可读流中读取内容并写入到可写流中
readerStream.pipe(writerStream)
模块
- exports + require
路由
server.js
var http = require('http')
var url = require('url')
function start(route){
function onRequest(request, response){
var pathname = url.parse(request.url).pathname
console.log("Request for" + pathname + "received.")
route(pathname)
response.writeHead(200, {"Content-Type": "text/plain"})
response.write("Hello World!")
response.end()
}
http.createServer(onRequest).listen(8888)
console.log("Server has started.")
}
exports.start = start
router.js
function route(pathname){
console.log("About to router a request for" + pathname)
}
exports.route = route
index.js
const server = require("./server");
const router = require("./router");
server.start(router.route)
- **_filename和_dirname**
__filename: 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。 如果在模块中,返回的值是模块文件的路径。
_dirname:表示当前执行脚本所在的目录。
文件系统
var fs = require("fs");
fs.readFile('filename', function(err, data){})
fs.readFileSync('filename', function(err, data){})
fs.open(path, flags, mode, callback)
fs.stat(path, function(err, stats){}) // 获取文件信息,其中stats是文件信息
fs.writeFile(file, data, option, callback)
fs.read(fd, buffer, offset, length, position, callback)
fs.close(fd, callback)
fs.ftruncate(fd, len, callback) //异步截取文件
fs.unlink(path, callback) // 删除文件
fs.mkdir(path, options, callback) // 创建目录
fs.readdir(path, callback) // 读取目录
fs.rmdir(path, callback) // 删除目录
GET / POST请求
var http = require('http')
var url = require('url')
var util = require('util')
GET请求的参数在url上,可以手动解析后面的参数
http.createServer(function(req, res){
res.writeHead(200, {"Content-Type": "text/plain"})
// var params = url.parse(req.url, true).query
// res.write("网站名:" + params.name);
// res.write("\n");
// res.write("网站 URL:" + params.url);
res.end(util.inspect(url.parse(req.url, true)))
}).listen(8888)
POST请求的内容都在请求体中,不会默认解析请求体,需要的时候需要手动解析
http.createServer(function(req, res){
// 暂存请求体信息
var post = ''
req.on('data', function(chunk){
post += chunk
});
req.on('end', function(){
post = querystring.parse(post)
res.end(util.inspect(post))
})
}).listen(3000)
web模块
1. 创建web服务器
var http = require('http')
var fs = require('fs')
var url = require('url')
http.createServer(function(request, response){
var pathname = url.parse(request.url).pathname;
console.log("Request for"+ pathname+"received")
fs.readFile(pathname.substr(1), function (err, data) {
if(err){
console.log(err)
response.writeHead(404, {'Content-Type': 'text/html'})
}else{
response.writeHead(200, {'Content-Type': 'text/html'})
response.write(data.toString());
}
response.end()
})
}).listen(8080)
console.log('Server running at http://127.0.0.1:8080/')
2. 创建web客户端
var http = require('http')
// 用于请求的选项
var options = {
host: "localhost",
port: "8080",
path: "/index.html"
}
// 处理响应的回调函数
var callback = function(response){
var body = ''
response.on('data', function(data){
body += data
})
response.on('end', function(){
console.log(body)
})
}
// 向服务端发送请求
var req = http.request(options, callback)
req.end()
注意:
需要保证web服务端8080正在运行,新开一个终端运行客户端。
Express框架
框架实例
express_demo.js
const express = require("express");
var app = express()
app.get('/',function(req, res){
res.send('Hello, woo!')
})
var server = app.listen(8081, '127.0.0.1', function(){
var a = server.address()
var host = server.address().address
var port = server.address().port
console.log(a)
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
express_demo2.js
添加路由可以根据不同的地址进行不同的请求
const express = require("express");
var app = express()
app.get('/', function(req, res){
console.log('主页get请求')
res.send('hello get')
})
app.post('/', function(req, res){
console.log('主页post请求')
res.send('hello post')
})
app.get('/del_user', function(req,res){
console.log('/del_user响应delete请求')
res.send('删除页面')
})
app.get('/list_user', function(req, res){
console.log('/list_user响应get请求')
res.send('用户列表页面')
})
// 对页面 abcd, abxcd, ab123cd, 等响应 GET 请求
app.get('/ab*cd', function(req, res){
console.log('/ab*cd响应get请求')
res.send('正则匹配')
})
var server = app.listen(8081, '127.0.0.1', function(){
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
静态文件
app.use('/public', express.static('public'));
将图片、CSS、JS文件放在public
目录下,在浏览器中访问 http://127.0.0.1:8081/public/images/logo.png
即可以访问到资源
请求方法
- GET
<form action="http://127.0.0.1:8081/process_get" method="GET">
First Name: <input type="text" name="first_name"> <br>
Last Name: <input type="text" name="last_name">
<input type="submit" value="Submit">
</form>
app.get('/process_get', function(req, res) {
var response = {
"first_name": req.query.first_name,
"last_name": req.query.last_name
}
console.log(response)
res.end(JSON.stringify(response))
})
- POST
<form action="http://127.0.0.1:8081/process_post" method="POST">
First Name: <input type="text" name="first_name"> <br>
Last Name: <input type="text" name="last_name">
<input type="submit" value="Submit">
</form>
const bodyParser = require("body-parser");
// 创建 application/x-www-form-urlencoded 编码解析,extended:false表示使用系统模块querystring来处理
var urlencodeParser = bodyParser.urlencoded({extended:false})
app.post('/process_post', urlencodeParser, function(req, res) {
var response = {
"first_name": req.body.first_name,
"last_name": req.body.last_name
}
console.log(response)
res.end(JSON.stringify(response))
})
- 文件上传
<form action="/file_upload" method="post" enctype="multipart/form-data">
<input type="file" name="image" size="50" /><br />
<input type="submit" value="上传文件" />
</form>
const bodyParser = require("body-parser")
const fs = require("fs")
const multer = require("multer")
app.use(bodyParser.urlencoded({extended:false}))
// multer将上传的图片传输到指定文件夹temp中,如果没有该文件夹会自动生成
app.use(multer({dest: '/tmp/'}).array('image'))
app.post('/file_upload',function(req, res) {
console.log(req.files[0])
console.log(__dirname)
var des_file = __dirname + '/' + req.files[0].originalname
fs.readFile(req.files[0].path, function(err, data){
fs.writeFile(des_file, data, function(err){
if(err){
console.log(err)
}else{
response = {
message: 'File uploaded successfully',
filename: req.files[0].originalname
}
}
console.log(response)
res.end(JSON.stringify(response))
})
})
})
- cookie管理
const cookieParser = require("cookie-parser")
const util = require("util")
app.use(cookieParser())
app.get('/', function(req, res){
console.log("Cookie:"+util.inspect(req.cookies)) //代码输出了客户端发送的 cookie 信息
})
var server = app.listen(8081, '127.0.0.1', function(){
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
RESTful API
json资源
{
"user1" : {
"name" : "mahesh",
"password" : "password1",
"profession" : "teacher",
"id": 1
},
"user2" : {
"name" : "suresh",
"password" : "password2",
"profession" : "librarian",
"id": 2
},
"user3" : {
"name" : "ramesh",
"password" : "password3",
"profession" : "clerk",
"id": 3
}
}
const express = require("express")
var app = express()
const fs = require("fs")
var server = app.listen(8081, '127.0.0.1', function(){
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
- get获取用户信息显示用户列表
app.get('/listUsers', function(req, res){
fs.readFile(__dirname + '/' + 'users.json', 'utf8', function(err, data){
console.log(data)
res.end(data)
})
})
- get添加用户信息。
JSON.parse()字符串转化为对象;JSON.stringify()将对象转换为字符串
var user = {
"user4" : {
"name" : "mohit",
"password" : "password4",
"profession" : "teacher",
"id": 4
}
}
app.get('/addUser', function(req, res){
fs.readFile(__dirname + '/' + 'users.json', 'utf8', function(err, data){
data = JSON.parse(data)
data["user4"] = user["user4"]
console.log(data)
res.end(JSON.stringify(data))
})
})
- 删除用户
var id = 2
app.get('/deleteUser', function(req, res){
fs.readFile(__dirname + '/' + 'users.json', 'utf8', function(err, data){
// console.log(data)
data = JSON.parse(data)
delete data["user"+ id]
console.log(data)
res.end(JSON.stringify(data))
})
})
- 获取指定用户详细信息。
app.get('/:id', function(req, res){
fs.readFile(__dirname + '/' + 'users.json', 'utf8', function(err, data){
data = JSON.parse(data)
var user = data["user" + req.params.id]
console.log(user)
res.end(JSON.stringify(user))
})
})
注意 :此处删除用户信息要在获取指定用户信息之前
nodejs第三方模块
- http
- fs:对本地文件的读写能力
- events:对外暴露EventEmitter,进行事件的绑定与监听
- body-parser:只能处理application/x-www-form-urlencoded 编码的数据并放到req.body中
- multer:处理含有图片文件等数据,会将上传的文件信息写到req.file中,表单文本信息写到req.body中
代码
学习过程中打的代码
https://download.csdn.net/download/weixin_44030736/12501390