Nodejs
Node.js是一个Javascript开源的服务器环境,运行在各种平台上(Windows,Linux,Unix,Mac OS X等)。
1.nodejs下载地址:<a href="http://nodejs.cn/download/">http://nodejs.cn/download/ </a> 下载windows版本,直接运行安装即可
2.运行nodejs脚本通过命令执行 node test.js (这里我使用IDE: Sublime Text3 )
<h1>NPM使用</h1>
3.NPM是随同的NodeJS一起安装的包管理工具
[code]npm install <模块名称> //Ex:redis mysql ...
//安装mysql模块
npm install mysql[/code]
使用模块 var mysql= require('mysql'); //不区分大小写(‘MySql’)
4.连接MySQL
1 //连接MySQL 2 var mysql = require('MYSql');//引入 3 var TABLE="bookuser" 4 var connection = mysql.createConnection({ 5 host : '127.0.0.1', //主机地址 6 user : 'root', //用户名 7 password : '123456', //密码 8 port: '3306', //端口 9 database:'test' //数据库名 10 });
<a href="https://www.runoob.com/nodejs/nodejs-mysql.html">更多参数</a>
<table class="reference">
<tbody>
<tr>
<td>host</td>
<td>主机地址 (默认:localhost)</td>
</tr>
<tr>
<td> user</td>
<td>用户名</td>
</tr>
<tr>
<td> password</td>
<td>密码</td>
</tr>
<tr>
<td> port</td>
<td>端口号 (默认:3306)</td>
</tr>
<tr>
<td> database</td>
<td>数据库名</td>
</tr>
<tr>
<td> charset</td>
<td>连接字符集(默认:'UTF8_GENERAL_CI',注意字符集的字母都要大写)</td>
</tr>
<tr>
<td> localAddress</td>
<td>此IP用于TCP连接(可选)</td>
</tr>
<tr>
<td> socketPath</td>
<td>连接到unix域路径,当使用 host 和 port 时会被忽略</td>
</tr>
<tr>
<td> timezone</td>
<td>时区(默认:'local')</td>
</tr>
<tr>
<td> connectTimeout</td>
<td>连接超时(默认:不限制;单位:毫秒)</td>
</tr>
<tr>
<td> stringifyObjects</td>
<td>是否序列化对象</td>
</tr>
<tr>
<td> typeCast</td>
<td>是否将列值转化为本地JavaScript类型值 (默认:true)</td>
</tr>
<tr>
<td> queryFormat</td>
<td>自定义query语句格式化方法</td>
</tr>
<tr>
<td> supportBigNumbers</td>
<td>数据库支持bigint或decimal类型列时,需要设此option为true (默认:false)</td>
</tr>
<tr>
<td> bigNumberStrings</td>
<td>supportBigNumbers和bigNumberStrings启用 强制bigint或decimal列以JavaScript字符串类型返回(默认:false)</td>
</tr>
<tr>
<td> dateStrings</td>
<td>强制timestamp,datetime,data类型以字符串类型返回,而不是JavaScript Date类型(默认:false)</td>
</tr>
<tr>
<td> debug</td>
<td>开启调试(默认:false)</td>
</tr>
<tr>
<td> multipleStatements</td>
<td>是否许一个query中有多个MySQL语句 (默认:false)</td>
</tr>
<tr>
<td> flags</td>
<td>用于修改连接标志</td>
</tr>
<tr>
<td> ssl</td>
<td>使用ssl参数(与crypto.createCredenitals参数格式一至)或一个包含ssl配置文件名称的字符串,目前只捆绑Amazon RDS的配置文件</td>
</tr>
</tbody>
</table>
更多说明可参见:<a href="https://github.com/mysqljs/mysql" target="_blank" rel="noopener">https://github.com/mysqljs/mysql</a>
SQL语句, userModSql_Params 的值分别对应‘?’
[code]//改 update
var userModSql = 'UPDATE bookuser SET username = ?,userpass = ? WHERE id = ?';
var userModSql_Params = ['Hello World','456789',13];
connection.query(userModSql,userModSql_Params,function (err, result) {
if(err){
console.log('[UPDATE ERROR] - ',err.message);
return;
}
console.log('----------UPDATE-------------');
console.log('UPDATE affectedRows',result.affectedRows);
console.log('******************************');
});
connection.end();
//增 add
var userAddSql = 'INSERT INTO bookuser(id,username,userpass) VALUES(0,?,?)';
var userAddSql_Params = ['Wilson', '123456'];
connection.query(userAddSql,userAddSql_Params,function (err, result) {
if(err){
console.log('[INSERT ERROR] - ',err.message);
return;
}
console.log('-------INSERT----------');
console.log('INSERT ID:',result.insertId);
console.log('INSERT ID:',result);
console.log('#######################');
});
connection.end();[/code]
也可将参数拼接在sql语句中
[code]//存 insert
function insert(title01,url01,date01,date02){
var userAddSql = 'INSERT INTO wechart03(id, title,url,pubtime,nowtime) SELECT 0,"'+title01+'", "'+url01+'", "'+date01+'","'+date02+'" FROM DUAL WHERE NOT EXISTS(SELECT * FROM wechart03 WHERE url = "'+url01+'")';
connection.query(userAddSql,function (err, result) {
if(err){
console.log('[INSERT ERROR] - ',err.message);
return;
}
console.log('-------INSERT----------');
console.log('INSERT ID:',result);
console.log('#######################');
});
//connection.end();
}
//改 update
function update(read,like,url02){
var userModSql = 'UPDATE wechart03 SET readnum = "'+read+'",likenum = "'+like+'" WHERE url = "'+url02+'"';
//var userModSql = 'UPDATE wechart02 SET readnum = ?,likenum = ? WHERE url = ?';
//var userModSql_Params = [read,like,url02];
connection.query(userModSql,function (err, result) {
if(err){
console.log('[UPDATE ERROR] - ',err.message);
return;
}
console.log('----------UPDATE-------------');
console.log('UPDATE affectedRows',result.affectedRows);
console.log('******************************');
});
//connection.end();
}[/code]
5.连接Redis
[code]//redis 连接
var redis = require('redis'),
RDS_PORT = 6379, //端口号
RDS_HOST = '127.0.0.1', //服务器IP
RDS_PWD = '123', //密码
// RDS_OPTS = {}, //设置项
//创建redis连接对象
client = redis.createClient(RDS_PORT,RDS_HOST);
// 验证连接
client.auth(RDS_PWD,function (){
console.log('连接redis成功!');
});
//Redis存值
client.set('test01','Redis',function(err,response){
console.log(err,response);
});
//Redis取值
client.get('test01',function(err,response){
console.log(err,response);
});[/code]
<div>redis.createClient(port, host, options)</div>
<div>默认port是6379,默认的host当然是127.0.0.1,options为一个对象,可以包含下列的属性:</div>
<div>parser: redis协议的解析器,默认是hiredis,如果像我一样悲剧的装不上,那该项会被设置为javascript;</div>
<div>no_ready_check: 默认为false,当连接建立后,服务器端可能还处在从磁盘加载数据的loading阶段,这个时候服务器端是不会响应任何命令的,这个时候node_redis会发送INFO命令来检查服务器状态,一旦INFO命令收到响应了,则表明服务器端已经可以提供服务了,此时node_redis会触发“ready”事件,这就是为什么会有“connect”和“ready”事件之分,如果你关闭了这个功能,我觉得会出现一些貌似灵异的问题;</div>
<div>enable_offline_queue: 默认为true,前面提到过,当连接ready之前,client会把收到的命令放入队列中等待执行,如果关闭该项,所有ready前的调用都将会立刻得到一个error callback;</div>
<div>retry_max_delay: 默认为null,默认情况下client连接失败后会重试,每次重试的时间间隔会翻倍,直到永远,而设置这个值会增加一个阀值,单位为毫秒;</div>
<div>connect_timeout: 默认为false,默认情况下客户端将会一直尝试连接,设置该参数可以限制尝试连接的总时间,单位为毫秒;</div>
<div>max_attempts: 默认为null,可以设置该参数来限制尝试的总次数;</div>
<div>
auth_pass: 默认为null,该参数用来认证身份。
<div><a href="https://gemfury.com/azuki-trusty/deb:azk/-/content/usr/lib/azk/node_modules/hipache/node_modules/redis"><em>更多事件、参数</em></a></div>
</div>
6.在 Node.js 中,创建一个模块并引用
在test01.js中定义如下函数
[code]module.exports = function Print() {
var name;
this.setName = function(thyName) {
name = thyName;
};
this.sayName = function() {
console.log('say ' + name);
};
};[/code]
在test02.js中调用
[code]var p = require('./test01');
var a = new p();
a.setName('ABCD');
a.sayName();[code]
控制台输出
[code]say ABCD
[/code]
7.Nodejs GET请求
[code]
var url = "https://mp.weixin.qq.com/mp/profile_ext?action=home"
+ "&__biz="+wechartCookie.biz
+ "&scene=124&devicetype=android-19"
+ "&version="+wechartCookie.version+"&lang=zh_CN&nettype=WIFI&a8scene=3&pass_ticket="
+ wechartCookie.passticket + "&wx_header=1";
console.log(url);
var request = require('request');
request({
url: url,
json: true,
headers: {
"Host": "mp.weixin.qq.com",
"x-wechat-uin":wechartCookie.uin,
"x-wechat-key":wechartCookie.key,
"User-Agent":"Mozilla/5.0 (Linux; Android 4.4.2; M688C Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 MicroMessenger/6.5.23.1180 NetType/WIFI Language/zh_CN",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Cookie":wechartCookie.cookies,
"X-Requested-With":"com.tencent.mm",
},
},function (error, response, html) {
if (!error && response.statusCode == 200) {
//.....
}[/code]
8.POST请求
[code]var url2 = "https://mp.weixin.qq.com/mp/getappmsgext?__biz=" + biz + "&mid=" + mid + "&sn=" + sn
+ "&idx=" + idx + "&scene=" + scene + "&f=json&appmsg_type=9&appmsg_token=" + wechartcook.appmsgtoken
+ "&x5=0&f=json&is_only_read=1&pass_ticket="+wechartcook.passticket+"&is_temp_url=0&is_need_reward=0&both_ad=0&reward_uin_count=0"
+ "&version=/mmbizwap/zh_CN/htmledition/js/appmsg/index3a9713.js&is_need_ad=1&msg_daily_idx=1"
+ "&is_original=0&uin=777&key=777";
// console.log(url2);
var request=require('request');
var options = {
url: url2,
method: "POST",
headers: {
"Host": "mp.weixin.qq.com",
"Connection":"keep-alive",
"Origin":"https://mp.weixin.qq.com",
"X-Requested-With":"XMLHttpRequest",
//"User-Agent":"Mozilla/5.0 (Linux; Android 4.4.2; M688C Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36MicroMessenger/6.5.23.1180 NetType/WIFI Language/zh_CN",
"User-Agent":"Mozilla/5.0 (Linux; Android 5.1.1; SM-G9350 Build/LMY48Z) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Safari/537.36 MicroMessenger/6.6.7.1321(0x26060737) NetType/WIFI Language/zh_CN",
"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
"Accept":"*/*",
//"Accept-Encoding":"gzip,deflate",
"Accept-Language":"zh-CN,en-US;q=0.8",
"Referer":url2,
"Cookie":wechartcook.cookies,
}
}
request(options, function (error, response, body){
if (!error && response.statusCode == 200) {
//.......
}[/code]
第三个参数 返回值(html body)。
9.Nodejs 定时器
[code]function func(){
console.log('dosomething');
}
//定时器1 执行一次
var t =setTimeout(func, 2000);
//清除定时器
clearTimeout(t);
//定时器2 周期执行
var t =setInterval(func, 2000);
//清除定时器
clearInterval(t);[/code]
10.创建子进程 child_process.fork()方法 创建一个子进程。
[code]//定时器,每隔3分钟执行一次
var child_process = require('child_process');
setInterval(function (){
//创建子进程
child_process.fork('./demo.js', {
});
}, 1000*60*3);[/code]
<em><strong>W3schools.com <a href="https://www.w3schools.com/nodejs/">了解更多</a></strong></em>