nodejs 的基本使用

安装 cnpm


npm install -g cnpm -registry=https://registry.npm.taobao.org

npm install http-server -g

 // 另一种方式,设置从淘宝镜像下载

npm config set registry http://registry.npm.taobao.org/
npm i

 

https://www.telerik.com/download/fiddler-b

 

wireshark

 

hosts 设定位置指向

---------

```
// 1. 引入http模块
const http = require('http');

// 2. 创建服务
const server = http.createServer(function(req, res) {
console.log('有人来访问了')
// 向客户端发送内容,并结束本次响应
res.end('{"Username":"zhangsan", "RealName":"张三", "CompanyName":"继善高科","Mac":"123"}');


});
// 3. 启动服务
server.listen(8001, function(req, res) {
console.log('服务器启动成功,请在http://localhost:8001中访问....');


return true;
});


```

全局对象

// 全局对象的宿主,类似于 window 对象
global 

process

// 是命令行参数数组
process.argv



global.process

// =========
// 输出到控制台中
process.stdout.write('hello');

// 将当前控制台中的文件清空
process.stdout.write('\033[2J');
process.stdout.write('\033[0f');

process.exit();

// =========
// 清空终端
process.stdin.resume();
process.stdin.on('data', (input) => {

  // console.log(i++);
  // 要在此处知道到底input是啥?

  input = input.toString().trim();
});


// =========
// 下一个事件循环时间处理
process.nextTick(callback);


// 尽量不要采用如下的方式来写
// // 不断的循环阻塞了代码的执行
// setTimeout(() => {
//   for (var i = 0; i < 1000000000; i++) {}
//   console.log('循环完了');
// }, 0);


事件发射器

var events = require("events");

var emitter = new events.EventEmitter();

// 指定事件监听方法
emitter.on("SomeEvent", function(argv1, argv2) {
    console.log("listener1", argv1, argv2);
});


emitter.on("SomeEvent", function(argv1, argv2) {
    console.log("listener2", argv1, argv2);
});


// 发射事件,多个事件监听方法都会被调用
emitter.emit("SomeEvent", "info", 1991);

文件

// 读文件

var fs = require('fs');

// 读取文件,第二个参数可以是回调函数,可以是文件的编码
fs.readFile('./1.png', function(error, data) {

  if (error) {
    console.log(error.stack);

    return ;
  }

  console.log(data.toString('base64'));

});


// 同步的方式来读取文件
var content = fs.readFileSync(`./frames/${i}.txt`, 'utf8');

fs.readFile('./1.png', (error, data) => {

  console.log(data.toString('base64'));

});



// =========
// ---------
// 写文件
const fs = require('fs');

fs.writeFile('./a.txt','he111llo');

HTTP服务器与客户端

获取GET参数

var url = require('url');
var util = require('util');

util.inspect(url.parse(req.url, true));

POST参数

var http = require('http');
var querystring = require('querystring');
var util = require('util');

http.createServer(function(req, res) {
        var post = '';
        req.on('data', function(chunk) {
        post += chunk;
    });

    req.on('end', function() {
        post = querystring.parse(post);
        res.end(util.inspect(post));
    });
}).listen(3000);

在 end 事件触发后,通过 querystring.parse 将 post 解析为真正的 POST 请求格式,然后向客户端返回。

【注意】 不要在真正的生产应用中使用上面这种简单的方法来获取 POST 请求,因为它有严重的效率问题和安全问题,这只是一个帮助你理解的示例。

返回数据

http.ServerResponse 是返回给客户端的信息,决定了用户最终能看到的结果。

http.ServerResponse 有三个重要的成员函数,用于返回响应头、响应内容以及结束请求。

response.writeHead(statusCode, [headers]):向请求的客户端发送响应头。
statusCode 是 HTTP 状态码,如 200 (请求成功)、404 (未找到)等。headers
是一个类似关联数组的对象,表示响应头的每个属性。该函数在一个请求内最多只
能调用一次,如果不调用,则会自动生成一个响应头。

response.write(data, [encoding]):向请求的客户端发送响应内容。data 是
一个 Buffer 或字符串,表示要发送的内容。如果 data 是字符串,那么需要指定
encoding 来说明它的编码方式,默认是 utf-8。在 response.end 调用之前,
response.write 可以被多次调用。

response.end([data], [encoding]):结束响应,告知客户端所有发送已经完
成。当所有要返回的内容发送完毕的时候,该函数 必须 被调用一次。它接受两个可
选参数,意义和 response.write 相同。如果不调用该函数,客户端将永远处于
等待状态。
http.createServer(function(req, res) {
    // HTTP 协议响应头
    res.writeHead(200, {'Content-Type': 'text/html'});

    // 服务器返回的数据
    res.write('<h1>nodejs</h1>');

    // 数据发送结束
    res.end();

http客户端

修改端口号:

GET 方式获取数据

var http = require('http');
http.get({host: 'www.baidu.com'}, function(res) {
    res.setEncoding('utf8');
    res.on('data', function (data) {
        console.log(data);
    });
});

POST的快捷方式

require的方式

port: 8080,

var options = {
    host: 'www.baidu.com',
    port: 8080,
    path: '/,
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length' : contents.length
    }
};

var req = http.request(options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function (data) {
        console.log(data);
    });
});
req.write(contents);
req.end();


bower官网

https://bower.io/

搜索插件

https://bower.io/search/

 

bower 包管理插件
    安装:
        1.下载安装node https://nodejs.org/en/ 注意:安装到默认盘符(不安装到默认盘符 不识别npm命令)
        2.安装git 下载git的安装包  安装到默认盘符
        3.安装bower: npm i -g bower
    使用:
        1.搜索需要的库 bower search 库名
        2.安装:bower install 库名
        3.卸载 bower uninstall 库名

 

https://bower.io/

 

CabloyJS

下面是相关资料的链接

CabloyJS是基于NodeJS的开源全栈框架,可以开发全场景业务

前端基于VueJS + Framework7,后端基于KoaJS + EggJS

1、GitHub源码: https://github.com/zhennann/cabloy
2、网易免费课程: https://study.163.com/course/courseMain.htm?courseId=1209403891

下面的几个网站也是用CabloyJS开发的:

1、官网(技术文档):https://cabloy.com/zh-cn/
2、社区(论坛): https://community.cabloy.com/zh-cn/index.html
3、博客: https://zhennann.com/
4、商店:https://store.cabloy.com

html5入门:教你用canvas写一个时钟

http://www.cnblogs.com/liugang-vip/p/3557983.html

 

Express

官网 http://www.expressjs.com.cn/

 

快速模板引导

http://www.expressjs.com.cn/starter/generator.html

安装代码:

 

 

express myapp // 创建应用 myapp, 名字可以改

cnpm install // 在 myapp 目录,安装对应依赖模块

node bin\www // 启动服务器 (npm start)

访问地址:

http://localhost:3000/

 

 

 

基本文件目录:

public: 今天资源目录

routes: 路由配置文件 (相当于控制器: Controller)

views: 模板文件结构

models:  模型

MVC 设计模式

M: Model 数据模型

V: View 视图(显示的页面)

C: Controller 控制器(在这里对应的是路由

 

 

 

请求参数的获取方法

GET参数的获取

req.query.参数名

POST参数的获取

参考文档: http://www.expressjs.com.cn/4x/api.html#req 搜 body

var bodyParser = require('body-parser');


// 为传输json的设置
app.use(bodyParser.json());
// 为解析application/x-www-form-urlencode的设置
app.use(bodyParser.urlencoded({ extended: true })); 

req.body.参数名

Cookie的获取

var express      = require('express')
var cookieParser = require('cookie-parser')
 
var app = express()
app.use(cookieParser())



req.cookies.name

https://www.npmjs.com/package/cookie-parser

 

连接 MySQL

文档

http://www.expressjs.com.cn/guide/database-integration.html#mysql

连接 MongoDB

文档

https://github.com/Automattic/mongoose

 

示例:

db.js

let mongoose = require('mongoose');

//连接MongoDB数据库,本地默认端口27017,数据库叫dumall

mongoose.connect('mongodb://127.0.0.1:27017/dumall');


mongoose.connection.on("connected", function () {//连接成功事件

console.log("MongoDB connected success.")

});


mongoose.connection.on("error", function () {//连接失败事件

console.log("MongoDB connected fail.")

});


mongoose.connection.on("disconnected", function () {//断开连接事件

console.log("MongoDB connected disconnected.")

});


module.exports = mongoose;

model

let mongoose = require('../db');

let userSchema = new mongoose.Schema({

"productId":String, //产品ID

"productName":String, //产品名称

"salePrice":Number, //价格

"checked":String, //购物车中是否选中

"productNum":Number, //购买的产品数量

"productImage":String //产品图片

});

//                             数据库中集合名
module.exports = mongoose.model("User",userSchema);

 

下载地址

http://nodejs.cn/download/

开发资料

nodejs使用request发送http请求

https://blog.csdn.net/dreamer2020/article/details/52074516

淘宝镜像替换

方式一:使用新的命令cnpm

你可以使用我们定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:

$ npm install -g cnpm --registry=https://registry.npm.taobao.org

方式二:继续使用npm命令

npm config set registry http://registry.npm.taobao.org/

 

如果方式一 中 cnpm 的安装,命令窗口无反应时,那么此时,就采用第二种方式尝试

 

或者用全路径方式重新执行一次:

C:\Users\Jack\AppData\Roaming\npm\cnpm i

Mac 下升级成最新版本的方法

n模块是专门用来管理nodejs版本的

sudo npm install -g n

升级nodejs是有两种方法:&nbsp;

升级到稳定版本

sudo n stable


升级到最新版本

sudo n latest

https://blog.csdn.net/chwshuang/article/details/54965100

循环读取文件目录脚本

var fs = require('fs');
var path = ".\\";

function readDirectory(dirPath) {
    if (fs.existsSync(dirPath)) {
        var files = fs.readdirSync(dirPath);
        
        files.forEach(function(file) {
            var filePath = dirPath + "/" + file;
            var stats = fs.statSync(filePath);
            if (stats.isDirectory()) {
                console.log('\n读取目录:\n', filePath, "\n");
                readDirectory(filePath);
            } else if (stats.isFile()) {

                if (filePath.indexOf(".html") > 0) {

                    // var buff = fs.readFileSync(filePath);

                    // // if (buff[0].toString(16).toLowerCase() == "ef" && buff[1].toString(16).toLowerCase() == "bb" && buff[2].toString(16).toLowerCase() == "bf") {
                    // //     //EF BB BF 239 187 191
                    // //     console.log('\发现BOM文件:', filePath, "\n");
                    // //     buff = buff.slice(3);
                    // //     fs.writeFile(filePath, buff.toString(), "utf8");
                    // // }

                    // fs.writeFile(filePath, str, "utf8");

                    // console.log(filePath);
                }
            }
        });       
    } else {
        console.log('Not Found Path&nbsp;: ', dirPath);
    }
}

readDirectory(path);

接口搭建参考

https://github.com/lvye1221/nodejs-demo/tree/master/api%E6%8E%A5%E5%8F%A3%E5%AE%9A%E4%B9%89

 

快速搭建HTTP服务器

cnpm install -g http-server 

 

link /usr/local/Cellar/node/6.2.2/bin/http-server@ -> /usr/local/Cellar/node/6.2.2/lib/node_modules/http-server/bin/http-server

link /usr/local/Cellar/node/6.2.2/bin/hs@ -> /usr/local/Cellar/node/6.2.2/lib/node_modules/http-server/bin/http-server

 

在发布的web文件夹目录下,执行命令

hs 

会提示访问的网站地址,打开即可

常见问题与解决

nodejs 缺少对象 代码:800A138F 

1. 注意路径 不能有中文

2. 文件名不要命名为 node.js

 

Error Listen:  3000

说明端口被占用了,重换1个端口即可。

 

 


解决tar ENOENT: no such file or directory, open '/node_modules/.staging

采用如下命令来安装依赖

cnpm i

 

也有采用如下方法来实现此方法的:

https://blog.csdn.net/jia611/article/details/78736719

书籍

《Node.js实战》(老)
 作者: Mike Cantelon,Node.js核心框架贡献者、Node社区活跃分子、资深培训师和演讲人。
       Marc Harter,Node.js核心框架贡献者。
       T.J. Holowaychuk,参与开发了很多Node.js模块,包括流行的Express框架。
       Nathan Rajlich,大名鼎鼎的TooTallNate,Node.js核心代码提交者。
《了不起的Node.js 将JavaScript进行到底》(老)
《Node与Express开发》(学express还不错,部分代码稍微有点老)
《Node.js实战(双色)》(老)   一起系列
《Node.js实战(第2季)》(不是入门书)一起系列
《Node.js权威指南》陆凌牛 工具书,翻译api
《深入浅出node.js》 朴灵 各种原理,吹nb必看,非入门读物。
《更了不起的 Node 4:将下一代 Web 框架 Koa 进行到底》桑世龙

技术网站推荐

http://stackoverflow.com/
https://cnodejs.org/

 

 

数据库连接

MySQL

cnpm install mysql --save

https://www.cnblogs.com/yf-html/p/8733837.html

var mysql=require('mysql');


//实现本地链接

var connection = mysql.createConnection({

    host: '192.168.1.103',

    port: 13306,

    user: 'root',

    password: '123456',

    database: 'ds_0705'

})


connection.connect(function (err) {

    if (err) {

        console.error('error connecting:' + err.stack)

    }

    console.log('connected as id ' + connection.threadId);

})


connection.query('SELECT * FROM ds_result', function (error, results, fields) {

    if (error) throw error;   

    var str = JSON.stringify(results);

});


connection.end();

 

 

其他方式

var orm = require("orm");

orm.connect("mysql://root:@localhost/web6cms", function (err, db) {
  if (err) throw err;

  var Person = db.define("person", {
    name     &nbsp;: String,
    surname  &nbsp;: String,
    age      &nbsp;: Number, // FLOAT
    male     &nbsp;: Boolean,
    continent&nbsp;: [ "Europe", "America", "Asia", "Africa", "Australia", "Antartica" ], // ENUM type
    photo    &nbsp;: Buffer, // BLOB/BINARY
    data     &nbsp;: Object // JSON encoded
  }, {
    methods: {
      fullName: function () {
        return this.name + ' ' + this.surname;
      }
    },
    validations: {
      age: orm.enforce.ranges.number(18, undefined, "under-age")
    }
  });

  // add the table to the database
  db.sync(function(err) {
    if (err) throw err;

    // add a row to the person table
    Person.create({ id: 1, name: "John", surname: "Doe", age: 27 }, function(err) {
      if (err) throw err;

      // query the person table by surname
      Person.find({ surname: "Doe" }, function (err, people) {
        // SQL: "SELECT * FROM person WHERE surname = 'Doe'"
        if (err) throw err;

        console.log("People found:&nbsp;%d", people.length);
        console.log("First person:&nbsp;%s, age&nbsp;%d", people[0].fullName(), people[0].age);

        people[0].age = 16;
        people[0].save(function (err) {
          // err.msg = "under-age";
        });
      });

    });
  });
});

JWT 

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

https://www.cnblogs.com/cjsblog/p/9277677.html

 

常用代码

获取调用传递的参数

// 接口请求地址
var url = "http://192.168.1.121:8181/ds-server/recieve";
var json = "./json/0605.json";

// 发送时间间隔,单位毫秒
var timeDeta = 1000;
var gIndex = 0;


const argv = process.argv

// 更新开始数据的发送序号
if (argv.length > 2) {
&nbsp;&nbsp; &nbsp;url = argv[2];
}

if (argv.length > 3) {
&nbsp;&nbsp; &nbsp;json = argv[3];
}

if (argv.length > 4) {
&nbsp;&nbsp; &nbsp;timeDeta = argv[4];
}

if (argv.length > 5) {
&nbsp;&nbsp; &nbsp;gIndex = argv[5];
}

读写文件

//引入数据库

var fs=require('fs');


var str = fs.readFileSync("./1.json");


fs.writeFile('./4-2.json', JSON.stringify(newArr),  function(err) {

    if (err) {

        throw err;

    }

    console.log('save newArr success');

})

 

 

 

 

十六进制字符串文件读写

// var arr = [0x55, 0xaa];
// var buff = new Buffer(arr)

var str = "55AA02";

// 从字符串中 获取buffer, 
var buff = Buffer.from(str, 'hex');

// console.log(buff);

var outputFile = "./1.txt";

// 同步写文件
fs.writeFileSync(outputFile, buff);

详解nodeJS之二进制buffer对象

https://www.jb51.net/article/115300.htm

使用buffer类处理二进制数据

https://www.cnblogs.com/tugenhua0707/p/4456300.html

官网 关于 buffer

https://nodejs.org/dist/latest-v10.x/docs/api/buffer.html#buffer_class_method_buffer_from_string_encoding

请求数据

SyntaxError: await is only valid in async function

 

https://segmentfault.com/a/1190000014026492?utm_source=index-hottest

 

要在 函数前 采用 async 定义此函数中为异步方式,其中 await 标注的代码为同步执行。

 

 PM2

PM2 是一个带有负载均衡功能的 Node 应用的进程管理器。

在使用pm2之前使用node方式来启动
node app.js
使用node启动方式,有很大弊端
当修改代码后必须重启node

后来使用了supervisor
更改了文件自己重载 不需要重启node

pm2可以实现0秒重载

第一步安装pm2
npm install -g pm2

第二步:
pm2 start app.js
pm2 stop app.js

$ npm install pm2 -g # 命令行安装 pm2
$ pm2 start app.js -i 4 # 后台运行pm2,启动4个app.js

<code>                     # 也可以把'max' 参数传递给 start
                     # 正确的进程数目依赖于Cpu的核心数目
</code>

$ pm2 start app.js --name my-api # 命名进程
$ pm2 list # 显示所有进程状态
$ pm2 monit # 监视所有进程
$ pm2 logs # 显示所有进程日志
$ pm2 stop all # 停止所有进程
$ pm2 restart all # 重启所有进程
$ pm2 reload all # 0 秒停机重载进程 (用于 NETWORKED 进程)
$ pm2 stop 0 # 停止指定的进程
$ pm2 restart 0 # 重启指定的进程
$ pm2 startup # 产生 init 脚本 保持进程活着
$ pm2 web # 运行健壮的 computer API endpoint (http://localhost:9615)
$ pm2 delete 0 # 杀死指定的进程
$ pm2 delete all # 杀死全部进程

运行进程的不同方式
$ pm2 start app.js -i max # 根据有效CPU数目启动最大进程数目
$ pm2 start app.js -i 3 # 启动3个进程
$ pm2 start app.js -x #用fork模式启动 app.js 而不是使用 cluster
$ pm2 start app.js -x -- -a 23 # 用fork模式启动 app.js 并且传递参数 (-a 23)
$ pm2 start app.js --name serverone # 启动一个进程并把它命名为 serverone
$ pm2 stop serverone # 停止 serverone 进程
$ pm2 start app.json # 启动进程, 在 app.json里设置选项
$ pm2 start app.js -i max -- -a 23 #在--之后给 app.js 传递参数
$ pm2 start app.js -i max -e err.log -o out.log # 启动 并 生成一个配置文件
你也可以执行用其他语言编写的app ( fork 模式):
$ pm2 start my-bash-script.sh -x --interpreter bash
$ pm2 start my-python-script.py -x --interpreter python

IT基础知识




posted @ 2017-02-27 07:47  lvye1221  阅读(14)  评论(0编辑  收藏  举报