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 &lt;模块名称&gt; //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=&quot;bookuser&quot; 
 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,&quot;'+title01+'&quot;, &quot;'+url01+'&quot;, &quot;'+date01+'&quot;,&quot;'+date02+'&quot; FROM DUAL WHERE NOT EXISTS(SELECT * FROM wechart03 WHERE url = &quot;'+url01+'&quot;)';
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 = &quot;'+read+'&quot;,likenum = &quot;'+like+'&quot; WHERE url = &quot;'+url02+'&quot;';
//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]

&nbsp;
<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 = &quot;https://mp.weixin.qq.com/mp/profile_ext?action=home&quot;
+ &quot;&amp;__biz=&quot;+wechartCookie.biz
+ &quot;&amp;scene=124&amp;devicetype=android-19&quot;
+ &quot;&amp;version=&quot;+wechartCookie.version+&quot;&amp;lang=zh_CN&amp;nettype=WIFI&amp;a8scene=3&amp;pass_ticket=&quot;
+ wechartCookie.passticket + &quot;&amp;wx_header=1&quot;;
console.log(url);
var request = require('request');
request({
url: url,
json: true,
headers: {
&quot;Host&quot;: &quot;mp.weixin.qq.com&quot;,
&quot;x-wechat-uin&quot;:wechartCookie.uin,
&quot;x-wechat-key&quot;:wechartCookie.key,
&quot;User-Agent&quot;:&quot;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&quot;,
&quot;Accept&quot;:&quot;text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&quot;,
&quot;Cookie&quot;:wechartCookie.cookies,
&quot;X-Requested-With&quot;:&quot;com.tencent.mm&quot;,
},
},function (error, response, html) {
if (!error &amp;&amp; response.statusCode == 200) {
//.....
}[/code]

8.POST请求

[code]var url2 = &quot;https://mp.weixin.qq.com/mp/getappmsgext?__biz=&quot; + biz + &quot;&amp;mid=&quot; + mid + &quot;&amp;sn=&quot; + sn
+ &quot;&amp;idx=&quot; + idx + &quot;&amp;scene=&quot; + scene + &quot;&amp;f=json&amp;appmsg_type=9&amp;appmsg_token=&quot; + wechartcook.appmsgtoken
+ &quot;&amp;x5=0&amp;f=json&amp;is_only_read=1&amp;pass_ticket=&quot;+wechartcook.passticket+&quot;&amp;is_temp_url=0&amp;is_need_reward=0&amp;both_ad=0&amp;reward_uin_count=0&quot;
+ &quot;&amp;version=/mmbizwap/zh_CN/htmledition/js/appmsg/index3a9713.js&amp;is_need_ad=1&amp;msg_daily_idx=1&quot;
+ &quot;&amp;is_original=0&amp;uin=777&amp;key=777&quot;;
// console.log(url2);

var request=require('request');
var options = {
url: url2,
method: &quot;POST&quot;,
headers: {
&quot;Host&quot;: &quot;mp.weixin.qq.com&quot;,
&quot;Connection&quot;:&quot;keep-alive&quot;,
&quot;Origin&quot;:&quot;https://mp.weixin.qq.com&quot;,
&quot;X-Requested-With&quot;:&quot;XMLHttpRequest&quot;,
//&quot;User-Agent&quot;:&quot;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&quot;,
&quot;User-Agent&quot;:&quot;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&quot;,
&quot;Content-Type&quot;:&quot;application/x-www-form-urlencoded; charset=UTF-8&quot;,
&quot;Accept&quot;:&quot;*/*&quot;,
//&quot;Accept-Encoding&quot;:&quot;gzip,deflate&quot;,
&quot;Accept-Language&quot;:&quot;zh-CN,en-US;q=0.8&quot;,
&quot;Referer&quot;:url2,
&quot;Cookie&quot;:wechartcook.cookies,
}
}

request(options, function (error, response, body){
if (!error &amp;&amp; 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>

posted @ 2018-10-25 11:41  atimo  阅读(159)  评论(0编辑  收藏  举报