NodeJs - 100
Nodejs官方文档
https://nodejs.org/en/
https://nodejs.org/en/docs/
Nodejs的特征:
1、采用非阻塞性IO机制;—— 不需要担心造成死锁
2、只支持单线程;
3、事件环;
类
class User {
constructor(data) {
super(data);
}
}
require 加载模块
var express = require('express');
var fs = require('fs');
var path = require('path');
var http = require('http');
练习1:本地服务器
var app = express();
var config = require('./config/config.js');
app = config(app);
app.listen(); //启动监听端口
console.log("端口已启动");
练习2:读写文本
//读取文本
fs.readFile(path.join(__dirname,'/data/test.json'),{encoding:'utf-8'},function(err,data){ if(err) throw err; console.log(data); }); //写入文本
fs.writeFile(path.join(__dirname,'/data/test.json'),"Hello World",function(err){ if(err) throw err; console.log("OK"); });
练习3:创建简单的http服务器
http.createServer(function(request,response){
response.writeHead(200,{'Content-Type':'text/plain'});
response.end('Hello World!');
}).listen('6634'); console.log("server runing");
练习4:常规断点调试
http.createServer(function(request,response){
response.writeHead(200,{'Content-Type':'text/plain'});
debugger
response.end('Hello World!');
}).listen('6634');
练习5:超级调试
先下载安装插件
sudo npm install -g node-inspector
启动插件
node-inspector
新建控制台
command+n
启动练习4的项目
node --debug app.js
google浏览器:http://localhost:8080/debug?port=5858
发送get/post请求
推荐配合request-promise使用。使用promise风格比较利于开发
https://github.com/request/request-promise
var _request = require('request'); # get请求示例
exports.load_AJAX = function(callback)
{
_request.get('http://localhost/json2.php',function(err,response,body)
{
if(response.statusCode = '')
{
callback(body);
}
})
} # post请求示例
var post_data = function(callback)
{
_request.post('http://localhost/json2.php',{
'key':'lovemp',
'name':'lee'
},function(err,response,body){
if(response.statusCode = '')
{
callback(body);
}
})
} # request支持application/x-www-form-urlencoded和multipart/form-data实现表单上传。不用操心设置header之类的琐事,request会帮你解决。
_request.post(API_SERVER, {form:{
UserId: 'A6F28BA9C3BDA307',
MethodName: 'user_info'
}},(err, response, body) => {
console.log(response.statusCode,err,response,body);
}) # 使用promise风格 : https://github.com/request/request-promise
var rp = require('request-promise');
var options = {
method: 'POST',
uri: API_SERVER,
form:{
UserId: 'A6F28BA9C3BDA307',
MethodName: 'user_info'
},
headers: {
/* 'content-type': 'application/x-www-form-urlencoded' */ // Set automatically
}
}; rp(options) .then(function (body) {
// POST succeeded...
console.log(body)
})
.catch(function (err) {
// POST failed...
console.log(err)
}); # 同上
var rp = require('request-promise');
rp.post(API_SERVER, {form:{
UserId: 'A6F28BA9C3BDA307',
MethodName: 'user_info'
}}).then( (body) => {
console.log(body)
}).catch(function (err) {
console.log(err)
});
express - RESTful API
"use strict";
const express = require('express');
const fs = require('fs');
const url = require('url'); let app = express();
let port = ;
let result = ""; // all、get、post三种方式
app.all('/ajax/menu/:id', function (req, res) {
res.header('Access-Control-Allow-Origin', '*');
res.header("Content-Type", "text/plain;charset=utf-8");
let id = req.params.id;
if(req.url!=="/favicon.ico" && !isNaN(id)) {
result = {state:"",msg:"success",result:fs.readFileSync("../data/menu.json", 'utf8')};
} else {
result = {state:"",msg:"shoperId is not defined"}
}
res.end(JSON.stringify(result));
})
var server = app.listen(port, function () {
console.log("Server Start!");
})
爬虫
需要下载三个依赖
sudo npm install express superagent cheerio --save-dev
知识点: express 新建本地服务器, superagent 发送get/post请求, cheerio 我最喜欢的nodejs版本的jquery,res.send 发送到页面
const express = require('express')
const superagent = require('superagent')
const cheerio = require('cheerio')
var app = express()
var resultArr = []
app.get('/', (req,res,next) => {
superagent.get('https://cnodejs.org/').end((err, response) => {
if(err) console.log(err)
let $ = cheerio.load(response.text)
$('#topic_list .topic_title').each((index,element) => {
let resultObj = {
title: '',
href: ''
}
resultObj.title = $(element).attr('title')
resultObj.href = $(element).attr('href')
resultArr.push(resultObj)
})
res.send(resultArr)
})
}) app.listen(process.env.PORT || 8090)
console.log('Server Start!')
解决charset、encoding gb2312的问题
https://www.cnblogs.com/CyLee/p/9557109.html
// npm i request cheerio iconv-lite
const request = require('request');
const cheerio = require('cheerio');
const iconv = require('iconv-lite'); request({
url: 'http://roll.mil.news.sina.com.cn/col/zgjq/index.shtml',
encoding : null
}, function (err, response, body) {
if (err) throw new Error(err.message);
var str = iconv.decode(response.body, 'GBK').toString();
console.log(20180829214413, str)
});
爬虫简单版
const superagent = require('superagent')
const cheerio = require('cheerio') superagent.get('http://localhost:8080/inde_x.html').end((err, response) => {
// 注意属性可以防止unicode编码
const $ = cheerio.load(response.text, {decodeEntities: false}) // 报告编号 + 查询时间 + 报告时间
const table1 = $('table table').eq(0).find('tr:nth-child(2)').find('.p')
// 报告编号
const report_number = table1.eq(0).html().split(":")[1];
// 查询时间
const query_time = table1.eq(1).html().split(":")[1];
// 报告时间
const report_time = table1.eq(2).html().split(":")[1];
// 打印测试
console.log(report_number,query_time,report_time) // 姓名 + 证件类型 + 证件号码 + 婚姻
const table2 = $('table table').eq(1).find('tr').find('.p')
// 姓名
const report_name = table2.eq(0).html().split(":")[1];
// 证件类型
const report_type = table2.eq(1).html().split(":")[1];
// 证件号码
const report_id = table2.eq(2).html().split(":")[1];
// 婚姻
const report_marriage = table2.eq(3).html();
// 打印测试
console.log(report_name,report_type,report_id,report_marriage) // 表格
let arr = []
// Copy Selector
const table3 = $('body > div > div > table > tbody > tr:nth-child(2) > td > table:nth-child(6) > tbody > tr:nth-child(3) > td > table > tbody > tr > td > table > tbody > tr')
table3.each((i, el) => {
let json = {}
$(el).find('td').each((index, ele) => {
json[index] = $(ele).text().trim()
})
arr.push(json);
})
console.log(arr)
})
爬虫2 + 代理服务器
访问地址:http:localhost:8090?query=123
知识点:get参数获取,header设置
const http = require('http')
const url = require('url')
const util = require('util')
const superagent = require('superagent')
const cheerio = require('cheerio') const onRequest = (req,res) => {
res.writeHead(200, {'Content-Type': 'text/plain;charset=utf-8', 'Access-Control-Allow-Origin': '*'})
/*
let money = encodeURI(url.parse(req.url,true).query.money);
let day = encodeURI(url.parse(req.url,true).query.day);
*/
let keyWord = encodeURI(url.parse(req.url,true).query.query); /* 最后一个query就是参数,在网页输入http://localhost:8090?query=123 就是了 */ if(keyWord){
superagent.get('http://weixin.sogou.com/weixin?type=1&query=' + keyWord + '&ie=utf8&_sug_=n&_sug_type_=').end(
(err,response) => {
if(err) console.log(err)
let resultArr = []
let $ = cheerio.load(response.text)
$('.mt7 .wx-rb').each((index, item) => {
let resultObj = {
title: '',
wxNum: '',
link: '',
pic: ''
}
resultObj.title = $(item).find('h3').text()
resultObj.wxNum = $(item).find('label').text()
resultObj.link = $(item).find('href').text()
resultObj.pic = $(item).find('img').attr('src')
resultArr.push(resultObj)
})
res.write(JSON.stringify(resultArr))
res.end()
})
}
} http.createServer(onRequest).listen(process.env.PORT || 8090);
console.log('Server Start!')
推荐代理方法:
神坑,注意 end 函数是异步的,所以res.end()也需要在回调中执行才正常
/* 这个API有详情,稍后再做 */
"use strict";
const http = require('http');
const url = require('url');
const util = require('util');
const superagent = require('superagent');
const open = require("open"); const appId = "2693ea802b98ae56d668a279e139c750";
let result = "";
let port = 8090; const onRequest = (req,res) => {
res.writeHead(200,{'Content-Type':'text/plain;charset=utf-8','Access-Control-Allow-Origin':"*"})
let qq = encodeURI(url.parse(req.url,true).query.qq);
console.log("QQ",qq);
if(req.url!=="/favicon.ico")
{
superagent.get(`http://japi.juhe.cn/qqevaluate/qq?qq=${qq}&key=${appId}`).end((err,response) => {
if(err) console.log(err);
console.log("response.text",response.text);
result = response.text;
res.write(result);
result = "";
res.end();
})
}
} http.createServer(onRequest).listen(port);
// open(`http://localhost:${port}?qq=928532756`);
console.log("Server Start!");
事件环机制
https://nodejs.org/dist/latest-v6.x/docs/api/events.html
在Nodejs中,虽然不会拥有和客户端一样的“click”,"onmouseover"之类的用户交互事件,但存在一系列服务器应用程序中所可能触发的各种事件,例如,当一个用户向服务端发出一个客户端请求时,将触发http服务器在nodejs中被定义为“request”的事件。
事件监听,在浏览器中输入http://localhost:1337
if(req.url !== "/favicon.ico") 为浏览器为页面在首场中的显示图标,通过该if屏蔽
var http = require('http');
var app = http.createServer(); app.on('request',function(req,res){
if(req.url !== "/favicon.ico"){
console.log(req.url);
}
res.end();
}).listen(1337,'127.0.0.1');
事件绑定以及触发
var http = require('http');
var app = http.createServer(); app.on('myevent',function(arg1,arg2,arg3){
console.log(arg1,arg2,arg3);
}) app.emit('myevent',1,2,3);
方法
序号 | 方法 & 描述 |
---|---|
1 | addListener(event, listener) 为指定事件添加一个监听器到监听器数组的尾部。 |
2 | on(event, listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。 server.on('connection', function (stream) { |
3 | once(event, listener) 为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。 server.once('connection', function (stream) { |
4 | removeListener(event, listener) 移除指定事件的某个监听器,监听器 必须是该事件已经注册过的监听器。 var callback = function(stream) { |
5 | removeAllListeners([event]) 移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。 |
6 | setMaxListeners(n) 默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。 |
7 | listeners(event) 返回指定事件的监听器数组。 |
8 | emit(event, [arg1], [arg2], [...]) 按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false。 |
类方法
序号 | 方法 & 描述 |
---|---|
1 | listenerCount(emitter, event) 返回指定事件的监听器数量。 |
事件
序号 | 事件 & 描述 |
---|---|
1 | newListener
该事件在添加新监听器时被触发。 |
2 | removeListener
从指定监听器数组中删除一个监听器。需要注意的是,此操作将会改变处于被删监听器之后的那些监听器的索引。 |
nodejs模块化编程
var _name,_age;
var name = '',age=0; var foo = function(name,age){
_name = name;
_age = age; foo.prototype.getName = function(){
return _name;
} foo.prototype.setName = function(name){
_name = name;
} foo.prototype.getAge = function(){
return _age;
} foo.prototype.setAge = function(age){
_age = age;
}
} foo.prototype.name = name;
foo.prototype.age = age; foo.staticName = '';
foo.staticFunction = function(){
console.log(foo.staticName);
} module.exports = foo;
使用上面的模块
var foo = require('foo'); var myFoo = new foo('Lee',18); console.log("第一次获取",myFoo.getName(),myFoo.getAge()); myFoo.setName("Mp");myFoo.setAge(19); console.log("修改私有变量后",myFoo.getName(),myFoo.getAge()); myFoo.name = "shenyi";
myFoo.age = 38; console.log("修改共有变量后",myFoo.getName(),myFoo.getAge(),"可以看出修改共有变量没有起作用"); console.log("下面我们使用类的静态属性和静态方法");
foo.staticName = "static Lee";
foo.staticFunction();
使用node_modules来管理模块
//在项目根目录下进行以下操作
mkdir node_modules //进入node_modules中,创建foo目录,然后进入创建index.js,将模块的代码放入其中。然后修改require('./test.js')的引用目录为require('foo');
cd node_modules;
mkdir foo;
cd foo;
touch index.js
进阶管理
//在foo文件夹中加入package.json,并加入以下代码:
{
"name":"foo",
"main":"./lib/foo.js"
} 新建一个lib文件夹,并且将index.js放入其中,然后改名为foo.js
NPM包管理工具
// 查看全局包的安装路径
npm root -g // 修改全局包的安装路径
npm config set prefix "d:\node" // 查看包的信息
npm view <包名> // 查看当前目录下所有的包
npm list // 查看安装路径下所有的包
npm list -g // 卸载某个包
npm uninstall <包名> // 卸载安装路径下的某个包
npm uninstall -g <包名> // 更新当前目录下所有包
npm update // 更新安装目录下所有包
npm update -g // 更新当前目录下某个包
npm update <包名> // 更新安装目录下某个包
npm update -g <包名>
文件操作系统
https://nodejs.org/dist/latest-v6.x/docs/api/fs.html
读取文件
/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs'); var data = fs.readFileSync("./index.html",'utf8');
console.log("同步读取,等待操作返回结果",data); fs.readFile('./index.html','utf8',function(err,data){
console.log("操作结果作为回调函数的第二个参数返回",data);
})
写入文件
/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs'); fs.writeFile('./test.txt','第一行。\r\n 第二行',function(err){
if(err) console.error("文件写入失败");
else console.log("文件写入成功");
})
追加数据
/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs'); var option = {
flag:"a"
} fs.writeFile('./test.txt','这是追加的数据',option,function(err){
if(err) console.error("文件写入失败");
else console.log("文件写入成功");
}) /* 也可以使用appendFileSync */
fs.appendFile('./test.txt','我又是追加的数据','utf8',function(err){
if(err) console.error("文件写入失败");
else console.log("文件写入成功");
})
文件的打开和读取
同理有readSync
/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs'); // data为打开文件时返回的文件描述符,在window中称为文件句柄
fs.open('./test.txt','r',function(err,data){
var buf = new Buffer(255);
// 从第0个开始到第9个字符,截取3个字符串
fs.read(data,buf,0,9,3,function(err,bytesRead,buffer){
console.log(buffer.slice(0,bytesRead).toString()); //从上一次读取的位置继续往下读
fs.read(data,buf,0,3,null,function(err,bytesRead,buffer){
console.log(buffer.slice(0,bytesRead).toString());
})
}) })
文件的打开和写入、追加
同理有writeSync
/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs'); var buf = new Buffer('我喜爱编程'); // w 会清空文件的内容
fs.open('./test.txt','w',function(err,data){
fs.write(data,buf,3,9,0,function(err,written,buffer){
if(err) console.log('写入文件失败');
console.log('写入文件成功');
})
})// a 追加文件内容
fs.open('./test.txt','a',function(err,data){
fs.write(data,buf,3,9,0,function(err,written,buffer){
if(err) console.log('写入文件失败');
console.log('写入文件成功');
})
})
close方法 / closeSync方法
当对文件的读写操作执行完毕后,我们通常需要关闭该文件。尤其是在文件以排他方式被打开时
/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs'); var buf = new Buffer('我喜爱编程'); // w 会清空文件的内容
fs.open('./test.txt','a',function(err,data){
fs.write(data,buf,0,15,0,function(err,written,buffer){
if(err) console.log('写入文件失败');
console.log('写入文件成功');
fs.close(data);
})
})
fsync 方法确保文件全部写入
在使用write/writeSync 方法在文件中写入数据时,操作系统的做法是首先将该部分数据读到内存中,再把数据写到文件中,这时如果你使用close/closeSync方法关闭文件时,就会造成数据流失。正确的姿势是使用fync方法来对文件进行同步操作。即把内存中缓冲区中的剩余数据全部写入文件中。写法如下
fs.fync(fd,[callback]) / fs.fyncSync(fd)
/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs'); var buf = new Buffer('我喜爱编程'); // w 会清空文件的内容
fs.open('./test.txt','a',function(err,data){
fs.write(data,buf,0,15,0,function(err,written,buffer){
if(err) console.log('写入文件失败');
console.log('写入文件成功');
fs.fsync(data);
fs.close(data);
})
})
mkdir创建文件目录
同理mkdirSync
/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs'); fs.mkdir('./test',function(err){
if(err) console.log('create失败');
else console.log('create成功');
})
readdir读取文件目录列表
同理readdirSync
/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs'); fs.readdir('./test',function(err,files){
if(err) console.log('失败');
else console.log(files);
})
stat/lstat查看目录信息,两者的区别是,当查看符号链接文件的信息时,必须使用后者
同理statSync / lstatSync
/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs'); fs.stat('./test',function(err,stats){
console.log(stats);
});
exists 检查文件或者目录是否存在
同理existsSync
/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs'); fs.exists('./test',function(exists){
if(exists) console.log('该文件存在');
else console.log('该文件不存在');
});
realpath获取文件或者目录的绝对路径
同理realpathSync
/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs'); fs.realpath('./test',function(err,path){
if(err) console.log("err");
else console.log(path);
})
utimes修改文件访问事件及修改时间
同理utimesSync
/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs'); fs.utimes('./test',new Date(),new Date(),function(err){
if(err) console.log("err");
console.log("修改文件时间操作成功");
})
chmod修改文件或者目录的读写权限
同理chmodSync
/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs'); // 0600 表示所有者可读写,其他人没有权限
fs.chmod('./test',0600,function(err){
if(err) console.log("err");
console.log("0600 表示所有者可读写,其他人没有权限");
}) // 0644 表示所有者可读写,其他人只读
fs.chmod('./test',0644,function(err){
if(err) console.log("err");
console.log("0644 表示所有者可读写,其他人只读");
}) // 0755 表示所有者有所有权限,其他人可读和执行
fs.chmod('./test',0755,function(err){
if(err) console.log("err");
console.log(" 0755 表示所有者有所有权限,其他人可读和执行");
}) // 0740 表示所有者有所有权限,所有者所在的组只读
fs.chmod('./test',0740,function(err){
if(err) console.log("err");
console.log("0740 表示所有者有所有权限,所有者所在的组只读");
})
rename 移动文件或者目录、重命名
同理renameSync
/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs'); var files = fs.rename('./test.txt','./test/test.txt',function(err){
if(err) console.log("err");
console.log("文件操作成功");
})
删除文件夹
// 删除文件夹
function deleteall(path) {
var files = [];
if(fs.existsSync(path)) {
files = fs.readdirSync(path);
files.forEach(function(file, index) {
var curPath = path + "/" + file;
if(fs.statSync(curPath).isDirectory()) { // recurse
deleteall(curPath);
} else { // delete file
fs.unlinkSync(curPath);
}
});
fs.rmdirSync(path);
}
};
socket.io
安装socket
npm install socket.io --save
我的demo(express版本):
"use strict";
const express = require('express');
const fs = require('fs');
const sio = require('socket.io'); let app = express();
app.get('',function(req,res){
res.end(fs.readFileSync('./index.html','utf8'));
})
var server = app.listen(port, function () {
console.log("Server Start!");
})
let socket = sio.listen(server);
// 注意其他事件的绑定必须在connection的回调中
socket.on('connection',function(socket){
console.log("socket start!");
socket.send("hello world");
socket.on("message",function(msg){
console.log(msg);
socket.send("server message send test");
})
socket.on('disconnect',function(){
console.log("the client is over");
})
socket.on("myevent",function(data){
console.log("the server is get client myevent:",data);
})
socket.emit('news',{newid:"123"});
})
再准备一个index.html
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta charset="utf-8">
<title>weicantimes</title>
<script type="text/javascript" src="/socket.io/socket.io.js"></script>
</head>
<body>
<div id="app">
<router-view keep-alive></router-view>
</div>
</body>
<script type="text/javascript">
console.log("index.html");
var socket = io.connect();
socket.on('message',function(msg){
console.log(msg);
// socket.send('client send message test');
})
socket.on('disconnect',function(){
console.log('server over');
}) socket.emit("myevent",{name:"Lee"}); socket.on("news",function(data){
console.log("news:",data);
})
</script>
</html>
如果是在VueJs中使用,则需要第三方模块:Vue-Socket.io
https://github.com/MetinSeylan/Vue-Socket.io
我的demo:
import VueSocketio from 'vue-socket.io';
Vue.use(VueSocketio, 'http://localhost:8090'); sockets : {
connect : function(){
console.log('socket connected')
},
client_menu : function(data){
console.log("client_menu",data)
}
} created () {
this.$socket.emit("server_menu",{name:"test"});
}
人机交互
function readSyncByfs(tips) {
tips = tips || '> ';
process.stdout.write(tips);
process.stdin.pause(); const buf = Buffer.allocUnsafe(10000);
let response = fs.readSync(process.stdin.fd, buf, 0, 10000, 0);
process.stdin.end(); return buf.toString('utf8', 0, response).trim();
} var a = readSyncByfs('请输入任意字符:');
var a = readSyncByfs('');
console.log(a);
NodeJs - 100的更多相关文章
- Angular2学习之开发环境构建
一.主要资料 http://blog.csdn.net/cz_jjq/article/details/50425206 http://www.tuicool.com/articles/mi6rmuB ...
- nodejs创建http服务器
之前有简单介绍nodejs的一篇文章(http://www.cnblogs.com/fangsmile/p/6226044.html) HTTP服务器 Node内建有一个模块,利用它可以很容易创建基本 ...
- Phantomjs+Nodejs+Mysql数据抓取(2.抓取图片)
概要 这篇博客是在上一篇博客Phantomjs+Nodejs+Mysql数据抓取(1.抓取数据) http://blog.csdn.net/jokerkon/article/details/50868 ...
- ASP.NET Core 性能对比评测(ASP.NET,Python,Java,NodeJS)
前言 性能是我们日常生活中经常接触到的一个词语,更好的性能意味着能给我们带来更好的用户体检.比如我们在购买手机.显卡.CPU等的时候,可能会更加的关注于这样指标,所以本篇就来做一个性能评测. 性能也一 ...
- 借助Nodejs探究WebSocket
文章导读: 一.概述-what's WebSocket? 二.运行在浏览器中的WebSocket客户端+使用ws模块搭建的简单服务器 三.Node中的WebSocket 四.socket.io 五.扩 ...
- [NodeJS] Hello World 起步教程
概述: 做数据,免不了需要展示数据,数据可视化是必须经历的步骤. 本文将提供一个NodeJS的起步教程,是笔者这两天探索的小结. 正文: 1. 为什么使用NodeJS 究竟是以B/S还是C/S的架构 ...
- NodeJs对Mysql封装
之前在学习NodeJs的时候,每次操作数据库都需要连接数据库然后开始写Sql操作,这样非常麻烦,然后自己对Mysql进行了封装,一共100多行代码. github地址: Mysql操作 我在里面对My ...
- nodejs中流(stream)的理解
nodejs的fs模块并没有提供一个copy的方法,但我们可以很容易的实现一个,比如: var source = fs.readFileSync('/path/to/source', {encodin ...
- Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)
概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容.主要是对电脑笔记本以及他们的属性进行抓取,然后在使用nodejs进行下载图片和插入数据库操作. ...
随机推荐
- mysqldump备份
备份工具1.mysqldump(数据量很大时不推荐使用) myisam 锁表 innodb 行锁 mysqldump --help | less #查看mysql所有的语法 mysqldu ...
- 【动态规划】The Triangle
问题 E: [动态规划]The Triangle 时间限制: 1 Sec 内存限制: 128 MB提交: 24 解决: 24[提交][状态][讨论版] 题目描述 73 88 1 02 7 4 44 ...
- 用jquery追加的元素不能触发treeview事件
在追加的元素后面添加: $("#navigation").treeview({ persist: "location", collapsed: true, un ...
- cVim—Chrome上更强大的vim插件
cVim——Chrome上更强大的vim插件 介绍 也许很多人在chrome上都用过类似Vimium, ViChrome的插件,这些插件的目的都差不多,就是在浏览器中提供一些类似vim的操作来提高效率 ...
- android 兼容性测试 CTS 测试过程(实践测试验证通过)
source: http://blog.csdn.net/jianguo_liao19840726/article/details/7222814 写这个博客的时候是为了记忆,建议大家还是看官方的说明 ...
- PHP站内搜索:多关键字、加亮显示
一.SQL语句中的模糊查找 主要通过LIKE(不区分大小写)关键字实现模糊查找.LIKE条件一般用在指定搜索某字段的时候, 通过"%"或者" _" ...
- node.js简单的页面输出
在node.js基本上没有兼容问题(如果你不是从早期的node.js玩起来),而且原生对象又加了这么多扩展,再加上node.js自带的库,每个模块都提供了花样繁多的API,如果还嫌不够,github上 ...
- VMware-WorkStation 序列号(转)
原文摘自: http://blog.csdn.net/twlkyao/article/details/8681927 最近升级了下虚拟机,可是还要序列号,网上找了几个可以用的,留着,备用. 9.0.2 ...
- C++的那些事:面向对象
1 OOP概述 面向对象基于三个基本概念:数据抽象.继承和动态绑定.通过使用数据抽象,我们可以将类的接口与实现分离:使用继承,可以定义相似的类型并对其相似关系建模:使用动态绑定,可以在一定程度上忽略相 ...
- TabLayout
效果图: 标题和fragment联动效果已经封装好了,非常方便 <android.support.design.widget.TabLayout android:id="@+id/ta ...