node.js开发平台入门实例

介绍

node.js是一个开发平台,该平台使用的编程语言是JavaScript语言。node.js平台是基于Chrome V8 JavaScript引擎构建的。

应用场景:基于node.js可以开发控制台程序(命令行程序、CLI程序)、桌面应用程序(GUI)(借助node-webkit electron等框架实现)、web应用程序(网站)。

PS: 何为开发平台,有对应的编程语言、有语言运行时、有能实现特定功能的API(SDK:Software Development Kit)。

特点

  • 事件驱动(当事件被触发时,执行传递过去的回调函数)
  • 非阻塞I/O模型(当执行I/O操作时,不会阻塞线程)
  • 单线程
  • 拥有世界最大的开源库生态系统——npm

文件的写入 fs.writeFile()

fs.writeFile(file,data[,options],callback)
const fs = require('fs')

var msg = 'Hello World'
//此处的./相对路径,node命令所执行的目录下寻找此文件
fs.writeFile('./hello.txt',msg,'utf8',function(err){
    if(err){
        console.log('写入失败,具体错误为:'+err)
    }else{
        console.log('写入成功')
    }
})

实现文件读取操作 fs.readFile()

fs.readFile(file[,options],callback)
const fs = require('fs')

fs.readFile('./hello.txt',function(err,data){
    if(err){
        throw err
    }
    //data参数的数据类型是一个Buffer对象,里面保存的是一个个字节
    //将buffer对象转换为一个字符串,可以调用toString()方法,不传参数,默认编码也是utf8
    console.log(data.toString('utf8'))
})

解决在文件读取中./相对路径的问题

__dirname:表示,当前正在执行的js文件所在目录
__filename:表示,当前正在执行的js文件的完整路径

let filename = __dirname + '\\' + 'a.txt'

路径拼接 path.join()

在windows 与 MacOS Linux中,路径斜杆的写法是不一样的,使用path.join拼接,自动匹配斜杆的写法。

const path = require('path')

let filename = path.join(__dirname,'a.txt')

创建一个简单的http服务程序

//加载http模块
var http = require('http')

//创建一个http服务对象
var server = http.createServer()

//监听用户的请求事件(request事件)
server.on('request',function(req,res){
    //解决乱码的思路:服务器通过设置http响应报文头,告诉浏览器使用响应的编码来解析网页
    res.setHeader('Content-Type','text/html;charset=urf-8')
    res.write('Hello World')
    //对于每一个请求,服务器必须结束响应,否则客户端(浏览器)会一直等待服务器响应结束
    res.end()
})

//启动服务
server.listen(8080,function(){
    console.log('server is running,please visit http://localhost:8080')
})
  • request对象包含了用户请求报文中的所有内容,通过request对象可以获取用户提交过来的数据
  • response对象用来向用户响应一些数据,当服务器要向客户端响应数据时必须使用response对象
  • 有了request对象和response对象,就既可以获取用户提交的数据,也可以向用户响应数据

根据不同请求做出不同响应 request.url可以得到用户请求的路径

var http = require('http')

http.createServer(function(req,res){
    if(req.url === '/' || req.url === '/index'){
        //res.write('hello index')
        //res.end() 以上两句话可以精简为
        res.end('hello index')
    }else if(req.url === '/login'){
        res.end('hello login')
    }else if(req.url === '/list'){
        res.end('hello list')
    }else{
        res.end('404,not Found')
    }
}).listen(8080,function(){
    console.log('server is running,please visit http://localhost:8080')
})

请求不同类型的文件

假设所有的静态资源都放在与server.js同一目录下的public文件夹内。引入第三方插件mime,用来设置每次请求所返回的文件的类型。

//server.js
var http = require('http')
var fs = require('fs')
var path = require('path')
var mime = require('mime')

http.createServer(function(req,res){
    var publicDir = path.join(__dirname,'public')
    var filename = path.join(publicDir,req.url)
    fs.readFile(filename,function(err,data){
        if(err){
            res.end('404')
        }else{
            res.setHeader('Content-Type',mime.getType(filename))
            res.end(data)
        }
    })
}).listen(8080,function(){
    console.log('server is running,please visit http://localhost:8080')
}

如此,即可请求任意文件,而无需使用if else逐一匹配。

推荐阅读更多精彩内容