Node.js学习之路(一)

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
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/a_xixi/article/details/86604509
今日推荐