目录
Node.js是什么?
Node.js特性
npm
require详解
API使用: fs http path
express框架
Node.js是什么?
Node.js特性
事件驱动
在Nodejs中,客户端请求建立连接,提交数据等行为,会触发相应的事件。在Node中,在一个时刻,只能执行一个事件回 调函数,但是在执行一个事件回调函数的中途,可以转而处理其他事件(比如,又有新用户连接了),然后返回继续执行 原 事件的回调函数,这种处理机制,称为“事件环”机制。
轻量和高效
npm
使用Node.js,首先应该下载安装,推荐node.js官方网站下载,下载后直接安装(选择下一步即可)。
require详解
nodejs中require使用非常频繁,或者说在模块化开发中起到非常重要的作用,使用通常类似这样:
var fs = require('fs')
const http = require('http')
可是你真的了解它吗?在node中require方法有两个作用:
假设,当前有两个文件,a.js和b.js,文件中分别导入或导出了一些变量、方法等,如下:
// a.js
var app = 'algjalsgjals'
var fun = function () {
return '777777777777'
}
// exports.app = app
// exports.fun = fun
// b.js
var adata = require('./a.js')
console.log(adata)
// console.log(exports) // 不会报错,输出值为 { }
当注释a模块中的最后两行代码,运行b模块,输出的adata为一个空对象 { }
而取消对exports的注释,运行b模块,输出的adata为:{ app: 'algjalsgjals', fun: [Function: fun] }
那么,这说明什么问题呢:
对模块化及require、import等不太熟悉的,推荐一篇博文,探索 模块打包 exports和require 与 export和import 的用法和区别
API使用
Nodejs中提供了很多的API功能,前端实际开发中用的不多,本文重点在于理解node的原理及日常使用,了解前端开发中常用的node功能模块,其他很多的功能模块,这里不一一详解,举几个简单的例子,具体使用详解参见Nodejs中文文档。
FileSystem,文件系统,样例:
// 引入fs模块
const fs = require('fs')
// 读文件
fs.readFile('./我的生词本.txt', function (err, data) {
console.log(data.toString())
console.log(err)
})
// 写文件
fs.writeFile('./writeFile.txt', '大家好,我是帅哥!', function (err) {
console.log('文件写入成功')
console.log(err)
})
使用http API可以快速的创建一个服务器
// 引入http模块
const http = require('http')
// 创建一个web服务器(使用createServe方法,返回一个Serve实例)
var serve = http.createServer();
// 注册 request 请求事件(当客户端发请求过来就会自动触发 request 请求事件,执行回调函数)
// 回调函数接收两个参数,request,response
// request是客户端发送的请求信息
// response有一个write方法,可以用来向客户端发送响应信息
serve.on('request', function (request, response) {
console.log('客户端请求发送成功')
// console.log(request)
response.writeHead(200, { 'Content-Type': 'text/plain;charset=UTF8' })// 设置响应头
response.write('这是服务端向客户端响应的内容~~~')
response.write('nodejs')
// 通过response.end方法结束响应,告诉客户端,服务端响应完毕
response.end()
})
// 绑定端口号,启动服务器
serve.listen('5000', function () {
console.log('服务器启动成功了~')
})
// 创建一个服务,并加载html文件,展示页面
var http=require("http");
var fs=require("fs"); //导入文件模块
var server =http.createServer(function(req,res){
//设置头信息
res.setHeader("Content-Type","text/html;charset='utf-8'");
//读文件
fs.readFile("./index.html","utf-8",function(err,data){
if(err) {
console.log("index.html loading is failed :"+err);
} else {
//返回index.html页面
res.end(data);
}
});
}).listen(8888); //监听端口,注:一个程序只能监听一个端口
path
path模块提供了一些用于处理文件与目录的路径的实用工具。
最常用的resolve方法:
// path
const path = require('path')
// 使用如:
index: path.resolve(__dirname, '../dist/index.html'),
// path.resolve() 方法将路径或路径片段的序列解析为绝对路径,
// 给定的路径序列从右到左进行处理,每个后续的 path 前置,直到构造出一个绝对路径
// 如果任何参数不是字符串,则抛出 TypeError
Node.js中提供了两个与文件操作相关全局可用变量__dirname和__filename,__dirname表示当前文件所在的目录,__filename表示正在执行脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。如果在模块中,返回的是模块文件所在的路径。
// 举例说明
// path.resolve([…paths])里的每个参数都类似在当前目录执行一个cd操作,从左到右执行,返回的是最后的当前目录
path.resolve('/foo/bar', './baz');
// 返回: '/foo/bar/baz'
path.resolve('/foo/bar', '/tmp/file/');
// 返回: '/tmp/file'
// 相当于cd /foo/bar //此时路径为 /foo/bar cd /tmp/file/ //此时路径为 /tmp/file
path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif');
// 如果当前工作目录为 /home/myself/node,
// 则返回 '/home/myself/node/wwwroot/static_files/gif/image.gif'
express框架
express是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。
原生的node开发存在很多问题:
所以express框架应运而生:
// Express安装
npm install express --save
// 使用案例
var express = require('express')
var app = express()
// Nodejs跨域问题解决及基本数据类型配置
app.all('*', function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*")
res.header("Access-Control-Allow-Headers", "X-Requested-With")
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS")
res.header("X-Powered-By", "3.2.1")
res.header("Content-Type", "application/json;charset=utf-8")
})
app.get('/haha', function (req, res) {
res.send('这里是哈哈的页面')
})
app.get(/^\/student\/([\d]{10})$/, function (req, res) {
res.send('学生信息,学号:' + req.params[0])
})
app.listen(3000, function() {
console.log("服务器启动成功了~")
})