前端学习7(node.js)

创建node.js应用:

1. require 指令来载入node自带的 http 模块

2. 创建服务器http.createServer() 

NPM包管理工具:允许用户从NPM服务器下载下载并安装别人编写的命令行程序到本地使用

例子:从npm中安装module 【express】,再用require调用

$ npm install express   //用uninstall卸载

var express = require('express');

package.json 位于模块的目录下,用于定义包的属性。使用 npm init 创建

REPL(交互式解释器) 输入node进入,在shell中输入语句,即刻返回结果

node.js都具有回调的功能,非阻塞异步编程的实现

阻塞/非阻塞:阻塞是顺序执行一项项任务,非阻塞不需要顺序执行

同步/异步:异步就像一个提醒器,告诉我什么时候那个任务完成了。

非阻塞异步实例:(readFile与console.log同步执行)

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});

console.log("程序执行结束!");

node.js单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。


事件驱动程序

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

// 创建事件处理程序
var connectHandler = function connected() {
   console.log('连接成功。');
  
   // 触发 data_received 事件 ,emit是触发的意思
   eventEmitter.emit('data_received');
}

// 绑定 connection 事件处理程序,on是绑定的意思,connection 就是函数 connectHandler
eventEmitter.on('connection', connectHandler);
 
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
   console.log('数据接收成功。');
});

// 触发 connection 事件 
eventEmitter.emit('connection');

console.log("程序执行完毕。");

events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装

当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。

js中只用字符串类型,Node.js定义Buffer 类来创建一个专门存放二进制数据的缓存区。

const buf = Buffer.from('runoob', 'ascii');  // 把runoob转化为二进制
// 输出 72756e6f6f62
console.log(buf.toString('hex'));
// 输出 cnVub29i
console.log(buf.toString('base64'));

node.js 调用require(一个文件为一个模块)

var http = require("http");

在原生模块http中请求,并返回本地变量。

自带了一个叫做 http 的模块,我们在我们的代码中请求它并把返回值赋给一个本地变量。

两种方式:

1. exports 对象把 world 作为模块的访问接口,在 main.js 中通过 require('./hello') 加载这个模块,然后就可以直接访 问 hello.js 中 exports 对象的成员函数了。

var hello = require('./hello');
hello.world();
exports.world = function() {  //hello文件里面的成员函数
  console.log('Hello World');
}

2.把export直接作为一个函数,调用其中的子函数

function Hello() { 
    var name; 
    this.setName = function(thyName) { 
        name = thyName; 
    }; 
    this.sayHello = function() { 
        console.log('Hello ' + name); 
    }; 
}; 
module.exports = Hello; //hello文件里面的
var Hello = require('./hello'); 
hello = new Hello(); 
hello.setName('BYVoid'); 
hello.sayHello(); 

__filename 表示当前正在执行的脚本的文件名

__dirname 表示当前执行脚本所在的目录。


setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。

var counter = 10;
console.log("计数: %d", counter);

util ~~继承,转换字符

util.inherits(Sub, Base);  //sub 继承base,只继承原型中定义的函数,而构造函数内部创造的 base 属 性和 sayHello 函数都没有被 Sub 继承

util.inspect(object,[showHidden],[depth],[colors]) 是一个将任意对象转换 为字符串的方法,用于调试输出

文件系统

读取文件:异步的 fs.readFile() 和同步的 fs.readFileSync()。异步更好,非阻塞,性能更高,更快

打开文件:fs.open(path, flags[, mode], callback)
获取文件信息:fs.stat(path, callback)
写入文件:fs.writeFile(file, data[, options], callback)
读取文件:fs.read(fd, buffer, offset, length, position, callback)

Node.js GET/POST请求

用get的方式请求

var http = require('http');
var url = require('url');
var util = require('util');
 
http.createServer(function(req, res){
    res.writeHead(200, {'Content-Type': 'text/plain'});
 
    // 解析 url 参数
    var params = url.parse(req.url, true).query;
    res.write("网站名:" + params.name);
    res.write("\n");
    res.write("网站 URL:" + params.url);
    res.end();
 
}).listen(3000);

用post的方式请求

var http = require('http');
var querystring = require('querystring');
 
var postHTML = 
  '<html><head><meta charset="utf-8"><title>菜鸟教程 Node.js 实例</title></head>' +
  '<body>' +
  '<form method="post">' +
  '网站名: <input name="name"><br>' +
  '网站 URL: <input name="url"><br>' +
  '<input type="submit">' +
  '</form>' +
  '</body></html>';
 
http.createServer(function (req, res) {
  var body = "";
  req.on('data', function (chunk) {
    body += chunk;
  });
  req.on('end', function () {
    // 解析参数
    body = querystring.parse(body);
    // 设置响应头部信息及编码
    res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
 
    if(body.name && body.url) { // 输出提交的数据
        res.write("网站名:" + body.name);
        res.write("<br>");
        res.write("网站 URL:" + body.url);
    } else {  // 输出表单
        res.write(postHTML);
    }
    res.end();
  });
}).listen(3000);

get/post 实例

http://www.runoob.com/nodejs/nodejs-express-framework.html


update 18.4.6  大概了解工作原理了,下次再补充


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值