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官网
搜索插件
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 库名
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)
访问地址:
基本文件目录:
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);
下载地址
开发资料
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是有两种方法: 升级到稳定版本 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 : ', 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 : String, surname : String, age : Number, // FLOAT male : Boolean, continent : [ "Europe", "America", "Asia", "Africa", "Australia", "Antartica" ], // ENUM type photo : Buffer, // BLOB/BINARY data : 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: %d", people.length); console.log("First person: %s, age %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) { url = argv[2]; } if (argv.length > 3) { json = argv[3]; } if (argv.length > 4) { timeDeta = argv[4]; } if (argv.length > 5) { 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
请求数据
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基础知识