Node.js学习笔记与代码

1 篇文章 0 订阅

创建应用

引入模块

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
即可以访问到资源

请求方法
  1. 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))
})
  1. 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))
})
  1. 文件上传
<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))
        })
    })
})

  1. 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第三方模块

  1. http
  2. fs:对本地文件的读写能力
  3. events:对外暴露EventEmitter,进行事件的绑定与监听
  4. body-parser:只能处理application/x-www-form-urlencoded 编码的数据并放到req.body中
  5. multer:处理含有图片文件等数据,会将上传的文件信息写到req.file中,表单文本信息写到req.body中

代码

学习过程中打的代码
https://download.csdn.net/download/weixin_44030736/12501390

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值