NodeJs & Javascript & Json Web Token related.

Execute a command line binary with Node.js
For even newer version of Node.js (v8.1.4), the events and calls are similar or identical to older versions,
but it’s encouraged to use the standard newer language features. Examples:
For buffered, non-stream formatted output (you get it all at once), use child_process.exec:
const { exec } = require(‘child_process’);
exec(‘cat *.js bad_file | wc -l’, (err, stdout, stderr) => {
if (err) {
// node couldn’t execute the command
return;
}

// the *entire* stdout and stderr (buffered)
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
});

You can also use it with Promises:
const util = require(‘util’);
const exec = util.promisify(require(‘child_process’).exec);

async function ls() {
const { stdout, stderr } = await exec(‘ls’);
console.log(‘stdout:’, stdout);
console.log(‘stderr:’, stderr);
}
ls();

Date.now()、new Date().getTime() 和 +new Date() 是浏览器环境下一直都有的,自然不必多说。
process.uptime() 返回的是Node程序已运行的时间,单位秒。
process.hrtime() 返回的是当前的高分辨率时间,格式为[秒, 纳秒]。它是相对于在过去的任意时间,该值与日期无关。优点是:可以获得一个非常精准的时间差,不会受到时钟飘逸的影响;缺点是:速度慢。
结论
要获取一个非常精确地时间间隔,用 process.hrtime();大量循环获取时间戳的时候,要考虑性能,用 Date.now()。

get the timestamp in seconds, you can use:
Math.floor(Date.now() / 1000)
Or alternatively you could use:
Date.now() / 1000 | 0
Which should be slightly faster, but also less readable

To convert the current date and time to a UNIX timestamp do the following:
var ts = Math.round((new Date()).getTime() / 1000);
getTime() returns milliseconds from the UNIX epoch, so divide it by 1000 to get the seconds representation.

timeStamp: Time: 1542769032854
The Date.now() method returns the number of milliseconds elapsed since January 1, 1970 00:00:00 UTC.
if (!Date.now) {
Date.now = function now() {
return new Date().getTime();
};
}

How to get year/month/day from a date object?
var dateObj = new Date();
var month = dateObj.getUTCMonth() + 1; //months from 1-12
var day = dateObj.getUTCDate();
var year = dateObj.getUTCFullYear();
newdate = year + “/” + month + “/” + day;

var dt = new Date();
dt.getFullYear() + “/” + (dt.getMonth() + 1) + “/” + dt.getDate();

new Date().toISOString()
“2016-02-18T23:59:48.039Z”
new Date().toISOString().split(‘T’)[0];
“2016-02-18”
new Date().toISOString().replace(‘-‘, ‘/’).split(‘T’)[0].replace(‘-‘, ‘/’);
“2016/02/18”
new Date().toLocaleString().split(‘,’)[0]
“2/18/2016”

var week = new Array(‘Sunday’, ‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’);
var day = week[today.getDay()];

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。
适用场景
1、用于向Web应用传递一些非敏感信息。例如完成加好友、下订单的操作等等。
2、用于设计用户认证和授权系统。
3、实现Web应用的单点登录。
JWT的组成
一个JWT实际上就是一个字符串,它由三部分组成:头部、载荷与签名。

单点登录
如果要实现在login.taobao.com登录后,在其他的子域名下依然可以取到Session,这要求我们在多台服务器上同步Session。
使用JWT的方式则没有这个问题的存在,因为用户的状态已经被传送到了客户端。
将含有JWT的Cookie的domain设置为顶级域名即可,例如
Set-Cookie: jwt=lll.zzz.xxx; HttpOnly; max-age=980000; domain=.taobao.com
注意domain必须设置为一个点加顶级域名,即.taobao.com。这样,taobao.com和*.taobao.com就都可以接受到这个Cookie,并获取JWT了。

const jwt = require(‘jsonwebtoken’);
//登录时:核对用户名和密码成功后,应用将用户的id(图中的user_id)作为JWT Payload的一个属性
module.exports = function(user_id){
const token = jwt.sign({
user_id: user_id
}, ‘sinner77’, {
expiresIn: ‘3600s’ //过期时间设置为60妙。那么decode这个token的时候得到的过期时间为 : 创建token的时间 + 设置的值
});
return token;
};

//检查token是否过期
module.exports = async ( ctx, next ) => {
if(ctx.request.header[‘authorization’]){
let token = ctx.request.header[‘authorization’].split(‘ ‘)[1];
//解码token
let decoded = jwt.decode(token, ‘sinner77’);
//console.log(decoded);的输出 :{ user_id: ‘123123123’, iat: 1494405235, exp: 1494405235 }
if(token && decoded.exp <= new Date()/1000){
ctx.status = 401;
ctx.body = {
message: ‘token过期’
};
}else{
//如果权限没问题,那么交个下一个控制器处理
return next();
}
}else{
ctx.status = 401;
ctx.body = {
message: ‘没有token’
}
}
};

Token based authentication is stateless. We are not storing any information about our user on the server or in a session.
GPG是GNU Privacy Guard的缩写,是自由软件基金会的GNU计划的一部分。它是一种基于密钥的加密方式,使用了一对密钥对消息进行加密和解密,来保证消息的安全传输。
base64加密后字符串的长度 设字符串长度为n ,长度为 [n/3]*4 []代表上取整
所谓Base64,就是说选出64个字符—-小写字母a-z、大写字母A-Z、数字0-9、符号”+”、”/”(再加上作为垫字的”=”,实际上是65个字符)—-作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符。
具体来说,转换方式可以分为四步。
第一步,将每三个字节作为一组,一共是24个二进制位。
第二步,将这24个二进制位分为四组,每个组有6个二进制位。
第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节。
第四步,根据下表,得到扩展后的每个字节的对应符号,这就是Base64的编码值。

We’ve seen how easy it is to implement JWT authentication and secure our API. To conclude,
let’s examine use cases where token based authentication is best suited for.
Platform-as-a-Service Applications – exposing RESTful APIs that will be consumed by a variety of frameworks and clients.
Mobile Apps – implementing native or hybrid mobile apps that interact with your services.
Single Page Applications (SPA) – building modern applications with frameworks such as Angular and React.

$ npm install jsonwebtoken
JWT.IO allows you to decode, verify and generate JWT.

setTimeout(()=>{
Math.round((Math.random() * (max – min)) + min);
humidity: Math.floor((Math.random() * 20) + 60)
temperature: Math.floor((Math.random() * 20) + 10),
}, 5000);
setTimeout只在指定时间后执行一次
setInterval以指定时间为周期循环执行

顶层函数(全局函数)
函数 描述
decodeURI() 解码某个编码的 URI。
decodeURIComponent() 解码一个编码的 URI 组件。
encodeURI() 把字符串编码为 URI。
encodeURIComponent() 把字符串编码为 URI 组件。
escape() 对字符串进行编码。
eval() 计算 JavaScript 字符串,并把它作为脚本代码来执行。
getClass() 返回一个 JavaObject 的 JavaClass。
isFinite() 检查某个值是否为有穷大的数。
isNaN() 检查某个值是否是数字。
Number() 把对象的值转换为数字。
parseFloat() 解析一个字符串并返回一个浮点数。
parseInt() 解析一个字符串并返回一个整数。
String() 把对象的值转换为字符串。
unescape() 对由 escape() 编码的字符串进行解码。

Math 对象属性
属性 描述
E 返回算术常量 e,即自然对数的底数(约等于2.718)。
LN2 返回 2 的自然对数(约等于0.693)。
LN10 返回 10 的自然对数(约等于2.302)。
LOG2E 返回以 2 为底的 e 的对数(约等于 1.414)。
LOG10E 返回以 10 为底的 e 的对数(约等于0.434)。
PI 返回圆周率(约等于3.14159)。
SQRT1_2 返回返回 2 的平方根的倒数(约等于 0.707)。
SQRT2 返回 2 的平方根(约等于 1.414)。

Math 对象方法
方法 描述
abs(x) 返回数的绝对值。
ceil(x) 对数进行上舍入。
floor(x) 对数进行下舍入
random() 返回 0 ~ 1 之间的随机数。
round(x) 把数四舍五入为最接近的整数。

JS位移问题-移位操作方法
移位操作要注意的问题是高(低)位是补0还是补1,具体操作如下:
(1)<< : (left-shift), 最低位补0。
(2)>> : (signed right-shift),右移过程使用符号位扩展(sign extension),即如果符号为为1则高位补1, 是0则补0,也就是逻辑右移。
(3)>>> : (unsigned right-shit),右移过程使用零扩展(zero extension),即最高位一律补0,也就是算术右移。
(4)移位操作的数据类型可以是byte, char, short, int, long型,但是对byte, char, short进行操作时,会先把它们变成一个int型,最后得到一个int型的结果,对long型操作时得到一个long型结果,不可以对boolean型进行操作。
(5)移位操作符可以和=合并起来,即 <<= 、 >>= 和 >>>=。例如 a >>= 2; 表示将a右移两位后的值重新赋给a。当时在使用这三个操作符对 byte, char, short型数据进行操作时要注意。
(6)JS没有专门的无符号左移操作(<<<)。

js遍历键值对数组:
for(var key in array){
console.log(“键:”,key);
console.log(“值:”,array[key]);
}
无规律json数组:
var json = [{dd: ‘SB’, AA: ‘东东’, re1: 123}, {cccc: ‘dd’, lk: ‘1qw’}];
for (var i = 0, l = json.length; i < l; i++) {
for (var key in json[i]) {
alert(key + ‘:’ + json[i][key]);
}
}

JS中==、===和Object.is()的区别
==:等同,比较运算符,两边值类型不同的时候,先进行类型转换,再比较;
===:恒等,严格比较运算符,不做类型转换,类型不同就是不等;
Object.is()是ES6新增的用来比较两个值是否严格相等的方法,与===的行为基本一致。


发表评论

电子邮件地址不会被公开。