2019-6-10lesson

Sep 13, 2019

docker mongo dump restore

Dump

docker run --name newMongo -p 27018:27017 --rm mongo

另开一个terminal

docker exec -it newMongo /bin/bash

mongodump -h 127.0.0.1 --port 27017 -d ${your db} -o /test/mongodBack

exit # 退出docker mongo容器

docker cp newMongo:/test/mongodBack/ /mongodBack/ # 将docker 内文件拷到/mongodBack/

Restore

待撸待撸

参考:https://www.cnblogs.com/qiyc/p/10150433.html

OAuth2-server 撸saas 微应用化

1
2
3
4
5
6
7
8
9
10
[Client frontend] GET /auth/honglian to [Client backend]
[Client backdnd] redirectTo [Server frontend] page : /oauth/authorize?clientId=x&redirectUri=x&response_code=code
[Server frontend] POST /oauth/login/authorise to [Server backend] to fetch oauth authorization_code
[Server frontend] redirectTo(window.location) redirectUri + code=${authorization_code}
[Client backend] get authorization_code
[Client backend] POST /oauth/access_token/?client_id=x -H 'authorization=${authorization_code}' to [Server backend] to fetch access_token
[Server backend] return access_token to [Client backend]
[Client backend] GET /api/user/?client_id=x&client_secret=x&access_token to [Server backend]
[Server backend] return userProfile to [Client backend]
[Client backend] redirectTo [/user/home]

beyond over!

参考:

  1. https://gist.github.com/tabone/d74fb922669e4edc22bfd0833b5ae88b

  2. https://www.cnblogs.com/vipzhou/p/8125924.html

www-form-urlencoded -d 里面的 空格 被替换成+的问题

场景是用户发送一个www-form-urlencoded 内容是一个机器码,比如MH20ew2r9RuTyGcX+rrmxF7X40U= 但是发现传到服务器时,却变成了MH20ew2r9RuTyGcX rrmxF7X40U=. 中间是空格代替。

原因是空格在urlencoded 中就是”+”。于是参数从软件客户端发到web 时都是正确的。但是到了body-parser 时,body-parser 看到一个 +,想都不想,直接就转成空格了。、

临时处理办法:将该文本转回去: string.replace(/\s/g, ‘+’)

最终解决方案:软件客户端使用urlencoded 刷新string

Chrome Extension 使用Vue 遇到的一些问题

Vue 使用webpack。但是background.js 属于后台,使用nodejs,于是webpack 找require 函数时可能会找不到比如fs 的库:Module not found.

做的第一种尝试: 在webpack 打包target 默认为的web 替换为node.

1
2
3
4
5
6
7
8
9
10
11
12
13
module.exports = {
target: 'web',
node: {
console:false,
global: true,
process: true,
fs: true,
__filename: 'mock',
___dirname: "mock",
Buffer: true,
setImmediate: false
}
}

但是这样的也导致输出的是node 环境。界面上的css 样式全部都不识别了。
于是替换一种思路。

第二种尝试: 前段还是按照前段,后端之所以称之为后端,那么便是另外一个项目了。webpack 打包时,打一个虚拟的,没有任务的background 包。于是yarn watch 阶段background 包打进去之后,手动替换里面background.js。

终于,里面运行的非常正常了。

这种方法不同点是,之前的background 配置是page,现在应为scripts

1
2
3
4
background: {
page: "./background.html"
scripts: ["./background.js"]
}

参考:

Typescript + mocha + chai 单元测试

1
2
3
4
5
6
7
8
yarn add mocha @types/mocha chai @types/chai chai-http @types/chai-http -D

package.json
scripts
test: NODE_ENV=test mocha -t 5000 --require ts-node/register test/**/*.ts

/test
diary.spec.ts

diary.spec.ts:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import { app } from '../src/app'
import chai, { expect } from 'chai'
import chaiHttp from 'chai-http'
chai.use(chaiHttp)
import 'mocha'

const userLoginCookie = '123456' // 由于使用OAuth 服务,那块代码就没有测,直接使用Cookie
describe('测试diary 接口', function () {
this.beforeEach(function (done) {
setTimeout(function () {
console.log('等待数据库载入完毕')
done()
}, 1000) // 时间可以加长,这里链接了mlab ,比较慢,可以为4000(有时仍然会出错)
})

it('Test getBudgetList', function (done) {
chai.request(app)
.post('/api/diary/getBudgetList')
.set('Cookie', userLoginCookie)
.end((err, res) => {
if (res.status === 403) {
done(new Error('403 用户需要先登录'))
} else {
const arr = res.body as any[]
expect(arr.length).to.equal(0)
done()
}
})
})
})

fs.read/readFile 在读取中文时乱码

需求:文件使用Buffer 读出, 然后一个一个解析里面的中英文
环境:文件很大, 所以没办法直接读出、直接写出

注意:这个需求不是编码的问题。比如GBK。GBK使用iconv_lite 解决

英文占一个字节,中文三个字节,所以一个个读出的buffer, 中文时便出现该字找不到,所以nodejs 使用 进行替换。

nodejs 那些常见的读写库其实都导入了string_decoder 的库

使用是:

1
2
3
4
5
6
7
8
import { StringDecoder } from 'string_decoder'
const decoder = new StringDecoder('utf-8')
while (true) {
const next = decoder.write(readBuffer)
if (next.length) {
// 这就是得到的buffer
}
}

decoder 原理是解析出来的,如果是中文三字节找不到,那么就储存起来,等到合并成一个。

附上 oneByOne 读写每个文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import { StringDecoder } from "string_decoder"
import * as fs from 'fs'
import { call } from './awaitCall'

export const one_openFile = async (absolutePath: string, mode='r') => {
const [e, fd] = await call(fs.open ,absolutePath, mode, 0o666)
if (e) throw e
return fd
}

export const one_readFile = async (fd: number, offset=0, cb?: Function) => {
const oneByOneSize = 1
const len = oneByOneSize
let readIndex = 0
const decoder = new StringDecoder('utf-8')
while (true) {
const readBuffer = Buffer.alloc(oneByOneSize)
const [err, res] = await call(fs.read, fd, readBuffer, offset, len, readIndex)
if (err) throw err
if (!res.bytesRead) {
// 文件读完了
return "文件读写完毕"
}
const next = decoder.write(readBuffer)
if (next.length) {
if (cb)
cb(next)
}
readIndex ++
}
}

Run Mocha programmatically

在代码中执行mocha。在实际环境中进行单元测试。

mocha 官网示例

stackoverflow

express-limiter

遇到情况:有一个注册、即立即登录,快速注册快速登录的接口,这里express-limiter 可以多次请求

去redis 上看了下,key 每次都不同

去express-limiter 里看了下, 他的redis key 来自line17: var key = opts.keyFormatter(opts.lookup(req))

Nginx 默认上传文件大小:1M

server {
listen 80;
server_name xxx;
client_max_body_size 100M;
}

vue-electron 使用electron-builder 不能打包win

issue:https://github.com/SimulatedGREG/electron-vue/issues/487

yarn build:win : “node .electron-vue/build.js && electron-builder -w”

TS 获取自身Class

1
2
3
4
5
6
class MyClass {}

const instance = new MyClass();

console.log(instance.constructor.name); // MyClass
console.log(MyClass.name); // MyClass

instance.constructor 就是得到的class 转义后的Class 对象。

Nginx 设置同源策略

这里还是使用上面文章说明:

1
2
3
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;

然后使用自己的域名。

以上完成了本次要搭建直播、理解推流、拉流的动作过程。

人生苦短,我们用go

有句话挺有意思的:

1
2
nodejs 可玩性还是蛮高的,可以C艹binding。
但是又多学一个,为什么不用golang?