node.js学习笔记
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
Node在实际开发中主要作为开发基础环境存在,用于进行模块管理,编译es6代码,编译sass文件,运行各种Js脚本。
安装Node.js和npm
从Node.js官网下载对应版本的安装程序,在windows环境下安装勾选add to path。
安装完成后,在命令提示符中输入node -v,npm -v查看是否正确安装:
$ node -v
v8.9.3
$ npm -v
5.5.1
基本使用
1.执行js脚本
$node demo
$node demo.js
2.REPL环境
在命令行键入node命令,进入一个Node.js的REPL环境(Read-eval-print loop,"读取-求值-输出"循环),可以直接运行JavaScript命令.
$ node
> 100+100
200
>
模块化
1.模块作用域
每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、 类,都是私有的,对其他文件不可见。
私有属性
// example.js
var x = 5;
var addX = function (value) {
return value + x;
};
上面代码中,变量x和函数addX,是当前文件example.js私有的,其他文件不可见。
全局属性
如果想在多个文件分享变量,必须定义为global对象的属性。
global.warning = true;
2.模块交互
每个模块内部,module变量代表当前模块,这个变量是一个对象,,他的exports属性是对外的接口,加载某个模块,其实就是加载该模块的module.exports属性。
定义模块
// example.js
var x = 5;
var addX = function (value) { return value + x; };
module.exports.x = x;
module.exports.addX = addX;
模块加载
require方法用于加载模块。
var example = require('./example.js');
console.log(example.x); // 5
console.log(example.addX(1)); // 6
模块对象
Node内部提供一个Module构建函数。所有模块都是Module的实例。每个模块内部,都有一个module对象,代表当前模块。它有以下属性:
module.id 模块的识别符,通常是带有绝对路径的模块文件名。
module.filename 模块的文件名,带有绝对路径。
module.loaded 返回一个布尔值,表示模块是否已经完成加载。
module.parent 返回一个对象,表示调用该模块的模块。
module.children 返回一个数组,表示该模块要用到的其他模块。
module.exports 表示模块对外输出的值。
exports变量
为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令。
var exports = module.exports;
搭建本地服务器
//http.js
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type','text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
基本模块
1.fs 用于处理文件系统
node.js内置的fs模块是文件系统模块,负责读写文件,同时提供同步异步方法。
//fs.js ----文件路径操作
var path = require('path');
var http = require('http');
var fs = require("fs")
var hostname = '127.0.0.1';
var port = 3000;
var server = http.createServer((req, res) => {
//res.statusCode = 200;
//res.setHeader('Content-Type', 'text/plain');
var url = req.url == '/' ? './demos/index.html' : './demos' + req.url;
if (fs.existsSync(url)) {
console.log(url)
var html = fs.readFileSync("./demos/index.html")
res.write(html);
}
res.end();
});
server.listen(port, hostname, (err) => {
if (err) {
console.log(err);
throw err;
}
console.log(`Server running at http://${hostname}:${port}/`);
});
对文件内容怎么操作?
// fs2.js----------.文件操作
var fs = require('fs');
//写文件
var res = fs.writeFileSync('./demos/wa1.txt', 'aaaa');
console.log(res);
//异步写文件
fs.writeFile('./demos/wa1', '异步', 'utf8', function (err) {
console.log(err);
})
//读文件
var data = fs.readFileSync('./demos/wa1.txt', 'utf8');
console.log(data.toString())
//异步读文件
fs.readFile('./demos/wa1.txt', 'utf8', function (err, data) {
console.log(err)
console.log(data.toString())
});
//判断文件是否存在
var res = fs.existsSync('./demos/wa1')
console.log(res)
fs.exists('./demos/wa1', function (res) {
console.log(res)
})
//追加文件内容
fs.appendFileSync('./demos/wa1.txt', "\n啦啦啦啦" + new Date(), 'utf8')
fs.appendFile('./demos/wa1.txt', '\n异步添加' + new Date(), function (err) {
console.log(err);
})
使用同步还是异步?
node环境执行的js代码是服务器端代码,绝大多数需要在服务器运行时反复执行的业务逻辑代码,需使用异步代码。
同步代码在执行时,服务器将停止响应,因为js只有一个执行线程。 服务器启动时需要读取配置文件或者结束时要写入到状态文件,可用同步代码,因为这些只在启动和结束时执行一次,不会影响服务器正常运行。
2.http模块(内置),主要用于服务器编程
//http.js
var http = require('http');
var urlModule = require('url');
var querystring = require('querystring');
//http://192.168.15.131:8080/
//每当接收到一个请求的时候都会执行回调函数
var server = http.createServer(function(req,resp){
//根据用户的请求给出用户对应的回应
var url = req.url; // /courses/aa?id=1001
var method = req.method; //GET POST(DELETE PUT)
var pathname = urlModule.parse(url).pathname; // /courses/aa
var query = urlModule.parse(url).query; // id=1001
var params = querystring.parse(query); //{id:1001}
//事件(用来接受以post方式提交的请求)
//req.on("data",function(){
// });
// req.on('end',function(){
//})
resp.writeHead(200,'ok',{
'content-type':'text/plain;charset=utf-8',
'Access-Control-Allow-Origin':'*'
});
switch(pathname){
case '/students':
//resp.write('以下是所有学生的信息:');
var students = [{
id:1001,
name:'terry',
gender:'男'
}
resp.write(JSON.stringify(students));
resp.end();
break;
case '/courses':
resp.write('以下是所有课程的信息:');
resp.end();
break;
case '/classes':
resp.write('以下是所有班级的信息:');
resp.end();
break;
case '/teachers':
resp.write('以下是所有教师的信息:');
resp.end();
break;
default:
resp.write('请求出错');
resp.end();
}
});
server.listen(8080,function(){
console.log('端口号为8080的服务已经开启...');
});
3.path模块 用于处理路径
//path.js
var path = require('path');
var a = '/home/briup/a.txt';
console.log("basename:",path.basename(a));//basename: a.txt
console.log("dirname:",path.dirname(a));//dirname: /home/briup
console.log("extname:",path.extname(a));//extname: .txt
console.log('isAbsolute:',path.isAbsolute(a));//isAbsolute: true
var basepath = 'http://localhost:8080';
var sonpath = './courses/findById';
console.log(path.join(basepath,sonpath));//http://localhost:8080/courses/findById
4.url模块 - 统一资源定位符(用于URL处理和解析)
//url.js
var url = require('url');
var a = 'http://192.168.15.138:8080/courses/query?credit=2&name=Java';
var urlObj = url.parse(a);//将一个url地址转换为一个对象
//请求地址
var pathname = urlObj.pathname;//'/courses/query'
var query = urlObj.query;//'credit=2&name=Java'
console.log(urlObj, pathname, query);
5.querystring模块 用于解析与格式化URL查询字符串
//querystring.js
var qs = require('querystring');
var query = 'credit=2&name=Java';
//将查询字符串转换为对象{credit:2,name:Java}
var qso = qs.parse(query);
console.log(qso);
console.log("查询字符串:",qs.stringify(qso));
第三方模块
1.mysql ----用于node.js链接数据库
$ npm install mysql
安装淘宝镜像
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
//mysql.js
// 1.加载mysql模块
var mysql = require("mysql");
// 2.创建连接对象
var connection = mysql.creatConnection({
host: "127.0.0.1",
port: "3306",
user: "root",
password: "root",
database: "web1701"
})
// 3.进行连接
connection.connect(function(err){
if(err){
// 连接失败
}
});
// 4.进行数据库操作
var sql = "select * from student"
connection.query(sql, function (err, results, fields) {
if(err){
throw err;
}else{
JSON.stringify(results);
}
})
// 5.关闭数据库连接
connection.end()
连接池
2.express —用于网络编程
web开发
下一篇更新
作者:yunyuand
来源:CSDN
版权声明:本文为博主原创文章,转载请附上博文链接!