nodejs基本操作学习分享会 3月

了解nodejs

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
Node.js 的包管理器 npm,是全球最大的开源库生态系统。

学习的目的

之前项目用php高频的采集和结算,让我们php的效率大大的降低,而且php阻塞让我们的网页无法正常的运行。所以找一种能替代php操作数据库 ,和采集的语言,并与php完美的结合。

初识nodejs

nodejs,就像我们php的composer ,能用npm 命令下载nodejs的相关插件。
用前端的javascrip只是就能操作基本的功能,学习的成本大大的降低了。

普通操作

nodejs 链接数据库

这个时候我们会依赖npm来下载mysql的模块
切换到我们项目,npm install mysql -save
创建一个运行sql的文件 mysql.js

//连接数据库
var mysql = require('mysql');
var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'root',
    database:'carbird'
});

connection.connect();
//查询
connection.query('select * from `think_order`', function(err, rows, fields) {
    if (err) throw err;
    console.log('查询结果为: ', rows);
});
//关闭连接
connection.end();

运行该js ,这个时候 就已经可以实现大部分功能了,定期的结算功能,分担php的压力,包括采集数据

做一个nodejs采集1680210彩票存入数据库的例子

创建 pacong.js

var http = require("http");
var iconv = require('iconv-lite');
var option = { 
hostname: "api.api68.com",
path: "/klsf/getLotteryInfo.do?issue=&lotCode=10005"
}; 
var req = http.request(option, function(res) {
res.on("data", function(chunk) {
console.log(JSON.parse( iconv.decode(chunk, "utf-8") ));
}); 
}).on("error", function(e) {
console.log(e.message);
});
req.end();

其中var iconv = require(‘iconv-lite’); 这个模块需要npm 下载引入,来解决中文乱码问题

结果为:

{ errorCode: 0,
  message: '操作成功',
  result:
   { businessCode: 0,
     message: '操作成功',
     data:
      { preDrawIssue: 2018030717,
        preDrawCode: '03,13,10,11,01,18,07,12',
        drawIssue: 2018030718,
        drawTime: '2018-03-07 12:01:20',
        preDrawTime: '2018-03-07 11:51:20',
        drawCount: 17,
        firstDragonTiger: 1,
        lastBigSmall: 0,
        sumBigSmall: 1,
        sumNum: 75,
        sumSingleDouble: 0,
        fourthDragonTiger: 0,
        secondDragonTiger: 0,
        thirdDragonTiger: 1,
        frequency: '',
        lotCode: 10005,
        iconUrl: 'http://webapp.1680180.com/images/icon/3x/[email protected]',
        shelves: 0,
        groupCode: 3,
        lotName: '广东快乐十分',
        totalCount: 84,
        serverTime: '2018-03-07 11:53:50',
        index: 100 } } }

引入cheerio 模块采集处理,比较复杂的数据 ,爬虫网站

var express = require('express');
var app = express();
var request = require('request');
var cheerio = require('cheerio');

app.get('/', function(req, res) {

  request('http://www.zhongjiantang.com/index.php?c=detail&id=57', function(error, response, body) {
    if (!error && response.statusCode == 200) {
      $ = cheerio.load(body);
      res.json({
          cat: $('h1').text()
      });
    }
  })
});

var server = app.listen(3000, function() {
  console.log('listening at 3000');
});

结合nodejs sql 的操作可以把数据插入数据库,或者其他相关操作

用nodejs做web页面,实现路由功能

用npm 引入 express

创建一个web.js

var express = require('express');
var app = express();

//  主页输出 "Hello World"
app.get('/', function (req, res) {
   console.log("主页 GET 请求");
   res.send('Hello GET');
})


//  POST 请求
app.post('/', function (req, res) {
   console.log("主页 POST 请求");
   res.send('Hello POST');
})

//  /del_user 页面响应
app.get('/del_user', function (req, res) {
   console.log("/del_user 响应 DELETE 请求");
   res.send('删除页面');
})

//  /list_user 页面 GET 请求
app.get('/list_user', function (req, res) {
   console.log("/list_user GET 请求");
   res.send('用户列表页面');
})

// 对页面 abcd, abxcd, ab123cd, 等响应 GET 请求
app.get('/ab*cd', function(req, res) {   
   console.log("/ab*cd GET 请求");
   res.send('正则匹配');
})


var server = app.listen(8081, function () {

  var host = server.address().address
  var port = server.address().port

  console.log("应用实例,访问地址为 http://%s:%s", host, port)

})

我们访问127.0.0.1:8081 就可以访问响应的 页面,或者操作

数据库的相关操作的分装

点击下载封装文件

先看如何使用

        db.select({
            table: '数据表',
            where: '字段名称='查询条件',
            success: function (result) {
                   //查询成功之后相关操作
                }
                ,})

以select 为例
创建sql:

exports.select = function(obj){
    if(!obj){
        log('对象不存在');
        return;
    }
    if(!obj.hasOwnProperty('field')){
        obj.field ="*";
    }
    var Sql = 'SELECT '+obj.field+' FROM '+obj.table ;
    if(obj.hasOwnProperty('where')){
        Sql+=' WHERE '+obj.where;
    }
    if(obj.hasOwnProperty('limit')){
        Sql+=' LIMIT '+obj.limit;
    }
    // console.log(Sql);
    db_query(Sql,obj);
};

执行sql:

function db_query(Sql,obj){
    var db_client=mysql.createClient(config.dbinfo);
    db_client.query(Sql,function(err,data){
        if(err){
            if(obj.error){
                if(obj.hasOwnProperty('error')){
                    obj.error(err);
                }
            }else{
                log('数据库出错:' + err.message);
            }
        }else{
            if(obj.hasOwnProperty('success')){
                obj.success(data);
            }
        }
        if(obj.hasOwnProperty('callback')){
            obj.callback(err,data);
        }
    });
    db_client.end();
}

如何去引用一个分装js文件

    var db = require('db'),

小结:数据库操作是一个异步的过程。能大大的提高nodejs的工作效率,同时进行

分析一个异步例子

//代码示例3
//注意还是那个Add,精髓也在这里,随后说到
function Add(a, b){
    return a+b;
}
//LazyAdd改变了,多了一个参数cb
function LazyAdd(a, cb){
    return function(b){
        cb(a, b);
    }
}
//将Add传给形参cb
var result = LazyAdd(1, Add)
// 这个时候去做一些其他的程序,等条件成立之后再去执行
result = result(2); // => 3

nodejs如何通过 http把数据发送到php

function requestKj(number) {
    var postData = JSON.stringify(number);
    var option = {
        host: 网址,
        path: 地址,
        method: 'POST',
        headers: {
            "Content-Type": 'application/json',
            "Content-Length": Buffer.byteLength(postData)
        }
    };
    var req = http.request(option, function (res) {
        res.on('data', function () {
        });
        res.on('end', function () {
            console.log('成功前端给php');
        });
    });
    req.write(postData);
    req.end();
    setTimeout(function () {
        yuegengxin(number);
    },1000)
}

php端接收nodejs传递的信息

    public function nodejs_get_data(){
        $data= json_decode(file_get_contents('php://input'),true);
        //对$data数据的相关操作
    }

总结

nodejs 接触的还是 冰山一角,要学得很多。
nidejs采集Api demo
nodejs大神博客教程

猜你喜欢

转载自blog.csdn.net/qq_22823581/article/details/79454420