Node.js学习之路

12月1
https://github.com/midwayjs/midway
Midway 是一个适用于构建 Serverless 服务,传统应用、微服务,小程序后端的 Node.js 框架。
Midway 可以使用 Koa,Express 或 Egg.js 作为基础 Web 框架。它还提供了独立使用的基本解决方案,例如 Socket.io,GRPC,Dubbo.js 和 RabbitMQ 等。
此外,Midway 也适用于前端/全栈开发人员的 Node.js 无服务器框架。构建下一个十年的应用程序。可在 AWS,阿里云,腾讯云和传统 VM /容器上运行。与 React 和 Vue 轻松集成。
Midway 是一个适用于构建 Serverless 服务,传统应用、微服务,小程序后端的 Node.js 框架。
Midway 可以使用 Koa,Express 或 Egg.js 作为基础 Web 框架。它还提供了独立使用的基本解决方案,例如 Socket.io,GRPC,Dubbo.js 和 RabbitMQ 等。
此外,Midway 也适用于前端/全栈开发人员的 Node.js 无服务器框架。构建下一个十年的应用程序。可在 AWS,阿里云,腾讯云和传统 VM /容器上运行。与 React 和 Vue 轻松集成。
11月25
package.json
[codes=c#]
"dependencies": {
"@ffmpeg-installer/ffmpeg": "^1.0.13",
"fluent-ffmpeg": "^2.1.2"
}
[/codes]
lib.js
[codes=c#]
const ffmpegInstaller = require('@ffmpeg-installer/ffmpeg');
const ffmpeg = require('fluent-ffmpeg');
ffmpeg.setFfmpegPath(ffmpegInstaller.path);
// console.log(ffmpegInstaller.path, ffmpegInstaller.version);
module.exports = ffmpeg;
[/codes]
app.js
[codes=c#]
const ffmpeg = require('./lib');
// cmd: ffmpeg -stream_loop -1 -i video.mp4 -f mpegts -codec:v mpeg1video -codec:a mp2 video.ts
const inputVideo = './video.mp4';
const outputVideo = './demo/video.ts';
var command = ffmpeg(inputVideo)
// set video bitrate
// .videoBitrate(1024)
// set aspect ratio
// .aspect('16:9')
// set size in percent
// .size('50%')
// set fps
// .fps(24)
.videoCodec('mpeg1video')
// set audio bitrate
.audioBitrate('128k')
// set audio codec
.audioCodec('mp2')
// 去掉声音
.noAudio()
// set number of audio channels
// .audioChannels(2)
// set custom option
// .addOption('-vtag', 'DIVX')
// set output format to force
.format('mpegts')
// setup event handlers
.on('end', function() {
console.log('file has been converted succesfully');
})
.on('error', function(err) {
console.log('an error happened: ' + err.message);
})
// save to file
.save(outputVideo);
[/codes]
代码见附件
JAVA版本https://github.com/freedomdebug/ffmpeg
[codes=c#]
"dependencies": {
"@ffmpeg-installer/ffmpeg": "^1.0.13",
"fluent-ffmpeg": "^2.1.2"
}
[/codes]
lib.js
[codes=c#]
const ffmpegInstaller = require('@ffmpeg-installer/ffmpeg');
const ffmpeg = require('fluent-ffmpeg');
ffmpeg.setFfmpegPath(ffmpegInstaller.path);
// console.log(ffmpegInstaller.path, ffmpegInstaller.version);
module.exports = ffmpeg;
[/codes]
app.js
[codes=c#]
const ffmpeg = require('./lib');
// cmd: ffmpeg -stream_loop -1 -i video.mp4 -f mpegts -codec:v mpeg1video -codec:a mp2 video.ts
const inputVideo = './video.mp4';
const outputVideo = './demo/video.ts';
var command = ffmpeg(inputVideo)
// set video bitrate
// .videoBitrate(1024)
// set aspect ratio
// .aspect('16:9')
// set size in percent
// .size('50%')
// set fps
// .fps(24)
.videoCodec('mpeg1video')
// set audio bitrate
.audioBitrate('128k')
// set audio codec
.audioCodec('mp2')
// 去掉声音
.noAudio()
// set number of audio channels
// .audioChannels(2)
// set custom option
// .addOption('-vtag', 'DIVX')
// set output format to force
.format('mpegts')
// setup event handlers
.on('end', function() {
console.log('file has been converted succesfully');
})
.on('error', function(err) {
console.log('an error happened: ' + err.message);
})
// save to file
.save(outputVideo);
[/codes]
代码见附件
JAVA版本https://github.com/freedomdebug/ffmpeg
6月20
https://graphql.cn/
使用GraphQL的理由
数据冗余和请求冗余 (overfetching & underfetching)
灵活而强类型的schema
接口校验 (validation)
接口变动,维护与文档
开发效率
问题
迁移成本
牺牲Performance
缺乏动态类型
简单问题复杂化
缓存能解决很多问题
项目
https://github.com/graphql/graphql-js/
https://github.com/graphql/express-graphql
https://github.com/apollographql/apollo-server
引用
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。
使用GraphQL的理由
引用
数据冗余和请求冗余 (overfetching & underfetching)
灵活而强类型的schema
接口校验 (validation)
接口变动,维护与文档
开发效率
问题
引用
迁移成本
牺牲Performance
缺乏动态类型
简单问题复杂化
缓存能解决很多问题
项目
https://github.com/graphql/graphql-js/
https://github.com/graphql/express-graphql
https://github.com/apollographql/apollo-server
3月5
XMPP是一种用于实时通信的开放技术,可支持各种应用程序,包括即时消息,状态,多方聊天,语音和视频通话,协作,轻量级中间件,内容联合以及XML数据的通用路由。
https://github.com/xmppjs/xmpp.js
https://github.com/xmppjs/xmpp.js
5月13
HTTP请求方法并不是只有GET和POST,只是最常用的。据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT。
使用node作为apiserver提供数据,h5ajax请求是无论如何过不了,
试探请求
真实请求
最终为node只支持了post和get,而没有对request method为options的请求做处理
添加如下代码搞定问题
[codes=c#]
if (request.method == 'OPTIONS') {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, HEAD, OPTIONS');
response.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, Accept, X-Requested-With');
response.setHeader('Content-Length', 0);
app.res.httpError(response,app.err.http.success);
return;
}
[/codes]
4月27
引用
在Node.js 5.0发布近6个月之后,Node.js基金会终于正式发布了带2年长期支持(LTS)的Node.js 6.0版本。根据Node.js基金会的LTS计划,Node.js 6.x能够在2018年4月前收到正式支持,而维护更新则会延续至2019年4月。随着今日新版本的发布,该基金会也结束了对0.12旧分支的LTS支持。其正式支持的版本为4.x和6.x,而此前5.x版本则是给即将到来的6.x版本做测试铺垫的。
Node.js 4.x的长期支持会在2017年4月截止,因而大家还有充足的时间切换到6.0x版本。2016年10月之前,Version 0.10和0.12只会收到维护更新;之后会在2016年12月迎来EoL(生命周期终止)。
node-js-version-6-released-with-long-term-support-503452-3.png
值得一提的是,Node.js 6覆盖了93%的ECMAScript 6(发布于去年6月的JavaScript 2015标准)特性。相比之下,Node.js 5x仅支持56%的ES6标准。
团队还隆重介绍了全新的模块加载系统,据说速度是Node.js 4.x的四倍以上。其它显著变动还有Node.js 6已经切换到使用Google V8 5.0版本(作为Node的JavaScript引擎),以及大量bug修复和性能改进。
[编译自:Soft Pedia]
12月15
nodejs守护进程,常用的有下面两个,推荐是用pm2,pm2 是一个带有负载均衡功能的Node应用的进程管理器.
forever
npm install -g forever
forever start app.js
forever stop app.js
forever restart app.js
forever list
pm2(https://github.com/Unitech/pm2)
npm install -g pm2
pm2 start app.js
pm2 stop app.js
pm2 restart app.js
pm2 list
#开启自启动
pm2 startup centos
pm2 save

forever
npm install -g forever
forever start app.js
forever stop app.js
forever restart app.js
forever list
pm2(https://github.com/Unitech/pm2)
npm install -g pm2
pm2 start app.js
pm2 stop app.js
pm2 restart app.js
pm2 list
#开启自启动
pm2 startup centos
pm2 save
6月15
之前的node httpapi一直使用forever守护,但有时候forever也会莫名奇妙的挂掉,最近尝试使用python来做守护进程(暂定为littledog),通过查收pid,如果没有就启动,但是遇到个问题,在启动的时候直接运行
#node /Service/Api/app.js
显示正常
但是在littledog里执行这句命令的时候始终无法执行
最终找到解决方案
#/usr/local/node/bin/node /Service/Api/app.js
即讲node的地址写全
#node /Service/Api/app.js
显示正常
但是在littledog里执行这句命令的时候始终无法执行
最终找到解决方案
#/usr/local/node/bin/node /Service/Api/app.js
即讲node的地址写全
4月8
1、安装socket.io
[codes=c#]
npm install socket.io
[/codes]
2、创建服务端代码server.js
[codes=c#]
var app = require('http').createServer(handler),
io = require('socket.io').listen(app),
fs = require('fs')
app.listen(8080);
io.set('log level', 1);//将socket.io中的debug信息关闭
function handler (req, res) {
fs.readFile(__dirname + '/index.html',function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(data);
});
}
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
[/codes]
3、创建客户端代码 index.html
[codes=c#]
Ssocket
[/codes]
4、执行结果
[codes=c#]
启动服务端:
node server.js
在浏览器输入 http://localhost:8080/index.html
浏览器打印出: world
命令行打印出:{ my: 'data' }
[/codes]
5、更多资料参见官方网站 http://socket.io/#how-to-use
6、服务端向指定客户端发送消息
思路是客户端与服务端建立连接的时候,服务端保存客户端的信息,做一个socketMap, 在socketMap中取出需要发送消息的客户端,向该客户端发送消息
做一个模拟的简单例子,这里用的是数组:
[codes=c#]
var sockets = [];
var i = 1;
io.sockets.on('connection', function (socket) {
sockets[i] = socket;
i++;
socket = sockets[1]; //这里指定向第一个客户发送消息
console.log(i);
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
[/codes]
!doctype>
[codes=c#]
npm install socket.io
[/codes]
2、创建服务端代码server.js
[codes=c#]
var app = require('http').createServer(handler),
io = require('socket.io').listen(app),
fs = require('fs')
app.listen(8080);
io.set('log level', 1);//将socket.io中的debug信息关闭
function handler (req, res) {
fs.readFile(__dirname + '/index.html',function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(data);
});
}
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
[/codes]
3、创建客户端代码 index.html
[codes=c#]
[/codes]
4、执行结果
[codes=c#]
启动服务端:
node server.js
在浏览器输入 http://localhost:8080/index.html
浏览器打印出: world
命令行打印出:{ my: 'data' }
[/codes]
5、更多资料参见官方网站 http://socket.io/#how-to-use
6、服务端向指定客户端发送消息
思路是客户端与服务端建立连接的时候,服务端保存客户端的信息,做一个socketMap, 在socketMap中取出需要发送消息的客户端,向该客户端发送消息
做一个模拟的简单例子,这里用的是数组:
[codes=c#]
var sockets = [];
var i = 1;
io.sockets.on('connection', function (socket) {
sockets[i] = socket;
i++;
socket = sockets[1]; //这里指定向第一个客户发送消息
console.log(i);
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
[/codes]
!doctype>