chenogeの日志


  • 首页

  • 归档

  • 搜索

mysql-where比较运算

发表于 2018-04-14

一、运算符

运算符 描述
= 等于
<> 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 !=
> 大于
< 小于
>= 大于等于
<= 小于等于
And 同时满足两个条件的值
Or 满足其中一个条件的值
Not 满足不包含该条件的值
is null 空值判断
between and 在某个范围内
LIKE 模糊查询( % 表示多个字值,_下划线表示一个字符; )
IN 指定针对某个列的多个可能值


阅读全文 »

mysql-If-Not-Exists

发表于 2018-04-14

一、创建数据库

1
CREATE DATABASE IF NOT EXISTS RUNOOB DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

数据库的校验规则

  • utf8_bin:将字符串中的每一个字符用二进制数据存储,大小写敏感
  • utf8_genera_ci:大小写不敏感(ci:case insensitive)
  • utf8_general_cs:大小写敏感(cs:case sensitive)


二、创建数据表

1
2
3
4
5
6
7
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • ENGINE=InnoDB:使用innodb引擎


三、判断数据库存在, 则删除

1
drop database if exists db_name;


四、判断数据表存在, 则删除

1
drop table if exists table_name;

koa2-cookie

发表于 2018-04-12

koa 提供了从上下文直接读取、写入 cookie 的方法

1
2
ctx.cookies.get(name, [options])	// 读取上下文请求中的 cookie
ctx.cookies.set(name, value, [options]) //在上下文中写入 cookie

options 的配置如下:

  • signed:cookie 是否加密(如果加密的话必须用 app.keys 指定加密短语)
  • maxAge:cookie 有效时长
  • expires:cookie 何时过期
  • path:cookie 的路径,默认为 ‘/’
  • domain:cookie 的域名
  • secure:cookie 是否只有 https 请求下才发送
  • httpOnly:是否只有服务器可以去到 cookie,默认为 true

  • overwrite:是否允许重写

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
const Koa = require('koa');
const app = new Koa();

// 指定加密短语
app.keys = ['secret1', 'secret2'];

app.use(async (ctx) => {
if(ctx.url === '/index'){
ctx.cookies.set(
'cid',
'hello worls',
{
signed:true,
domain: '127.0.0.1',
path: '/index',
maxAge: 10 * 60 * 1000,
expores: new Date('2017-09-09'),
httpOnly: false,
overwrite: false,
secure: false
}
);
ctx.body = 'cookies is ok';
} else {
ctx.body = 'hello world';
}
});

app.listen(3000, () => {
console.log('[demo] cookie is starting at port 3000')
})

koa2-获取请求数据

发表于 2018-04-12

零、对象

ctx.request是context经过封装的请求对象,ctx.req是context提供的node.js原生HTTP请求对象。


同理ctx.response是context经过封装的响应对象,ctx.res是context提供的node.js原生HTTP请求对象。


一、GET请求

在koa中,获取GET请求数据源头是koa中request对象中的query方法或querystring方法。query返回是格式化好的参数对象,querystring返回的是请求字符串。

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
const Koa = require('koa')
const app = new Koa()

app.use( async ( ctx ) => {
let url = ctx.url
// 从上下文的request对象中获取
let request = ctx.request
let req_query = request.query
let req_querystring = request.querystring

// 从上下文中直接获取
let ctx_query = ctx.query
let ctx_querystring = ctx.querystring

ctx.body = {
url,
req_query,
req_querystring,
ctx_query,
ctx_querystring
}
})

app.listen(3000, () => {
console.log('[demo] request get is starting at port 3000')
})


阅读全文 »

koa2-中间组件middleware

发表于 2018-04-12

一、中间组件

Koa2通过app.use()把很多async函数组成一个处理链,每个async函数都可以做一些自己的事情,然后用await next()来调用下一个async函数。我们把每个async函数称为middleware。

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
// 在koa2中,我们导入的是一个class,因此用大写的Koa表示:
const Koa = require('koa');

// 创建一个Koa对象表示web app本身:
const app = new Koa();

app.use(async (ctx, next) => {
console.log(`${ctx.request.method} ${ctx.request.url}`); // 打印URL
await next(); // 调用下一个middleware
});

app.use(async (ctx, next) => {
const start = new Date().getTime(); // 当前时间
await next(); // 调用下一个middleware
const ms = new Date().getTime() - start; // 耗费时间
console.log(`Time: ${ms}ms`); // 打印耗费时间
});

app.use(async (ctx, next) => {
await next();
ctx.response.type = 'text/html';
ctx.response.body = '<h1>Hello, koa2!</h1>';
});

// 在端口3000监听:
app.listen(3000);


二、数据传递

koa约定了一个中间件的存储空间ctx.state,通过这个state可以共享一些的数据。

koa2-mysql连接池

发表于 2018-04-12

一、创建数据库会话

mysql.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const mysql = require('mysql')
const connection = mysql.createConnection({
host : '127.0.0.1', // 数据库地址
user : 'root', // 数据库用户
password : '123456' // 数据库密码
database : 'my_database' // 选中数据库
})

connection.connect();

// 执行sql脚本对数据库进行读写
connection.query('SELECT * FROM my_table', (error, results, fields) => {
if (error) throw error
// connected!
// 结束会话
connection.release()
});


二、创建数据连接池

一般情况下操作数据库是很复杂的读写过程,不只是一个会话,如果直接用会话操作,就需要每次会话都要配置连接参数。所以这时候就需要连接池管理会话。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const mysql = require('mysql')
// 创建数据池

const pool = mysql.createPool({
host : '127.0.0.1', // 数据库地址
user : 'root', // 数据库用户
password : '123456' // 数据库密码
database : 'my_database' // 选中数据库
})

// 在数据池中进行会话操作
pool.getConnection(function(err, connection) {
connection.query('SELECT * FROM my_table', (error, results, fields) => {
// 结束会话
connection.release();
// 如果有错误就抛出
if (error) throw error;
})
})

koa2-session

发表于 2018-04-12

一、session应用

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
const Koa = require('koa')
const session = require('koa-session-minimal')
// koa-mysql-session为koa-session-minimal中间件提供MySQL数据库的session数据读写操作
// koa-session-minimal默认使用内存保存session对象
const MysqlSession = require('koa-mysql-session')
const app = new Koa()

// 配置存储session信息的mysql
let store = new MysqlSession({
user: 'root',
password: 'abc123',
database: 'koa_demo',
host: '127.0.0.1',
})

// 存放sessionId的cookie配置
let cookie = {
maxAge: '', // cookie有效时长
expires: '', // cookie失效时间
path: '', // 写cookie所在的路径
domain: '', // 写cookie所在的域名
httpOnly: '', // 是否只用于http请求中获取
overwrite: '', // 是否允许重写
secure: '',
sameSite: '',
signed: ''
}

// 使用session中间件
app.use(session({
key: 'SESSION_ID',
store: store,
cookie: cookie
}))

app.use( async ( ctx ) => {
// 设置session
if ( ctx.url === '/set' ) {
ctx.session = {
user_id: Math.random().toString(36).substr(2),
count: 0
}
ctx.body = ctx.session
} else if ( ctx.url === '/' ) {
// 读取session对象
ctx.session.count = ctx.session.count + 1
ctx.body = ctx.session
}
})

app.listen(3000)
console.log('[demo] session is starting at port 3000')


阅读全文 »

JS-连续赋值

发表于 2018-04-11

一、先看问题

1
2
3
4
5
var a = {n:1}; 
var b = a;
a.x = a = {n:2};
console.log(a.x);// --> undefined
console.log(b.x);// --> [object Object]


二、逐步分析

下面来分析下这段简单代码的工作步骤,从而进一步理解js引用类型“赋值”的工作方式。首先是:

1
2
var a = {n:1}; 
var b = a;

在这里a指向了一个对象{n:1}(我们姑且称它为对象A),b指向了a所指向的对象,也就是说,在这时候a和b都是指向对象A的。这一步很好理解,接着继续看下一行非常重要的代码:

1
a.x = a = {n:2};

我们知道js的赋值运算顺序永远都是从右往左的,不过由于“.”是优先级最高的运算符,所以这行代码先解析了a.x。这时候发生了这个事情——a指向的对象{n:1}新增了属性x(虽然这个x是undefined的):

从图上可以看到,由于b跟a一样是指向对象A的,要表示A的x属性除了用a.x,自然也可以使用b.x来表示了。

接着,依循“从右往左”的赋值运算顺序先执行 a={n:2} ,这时候,a指向的对象发生了改变,变成了新对象{n:2}(我们称为对象B):

接着继续执行

1
a.x = a;

很多人会认为这里是“对象B也新增了一个属性x,并指向对象B自己”。但实际上并非如此,由于( . 运算符最先计算)一开始js已经先计算了a.x,便已经解析了这个a.x是对象A的x,所以在同一条公式的情况下再回来给a.x赋值,也不会重新解析这个a.x为对象B的x。所以 a.x=a 应理解为对象A的属性x指向了对象B:

webpack-路径问题

发表于 2018-04-10

一、context

context 是 webpack 编译时的基础目录,webpack会根据此目录去查找入口起点(entry)。

若不配置,默认值为当前目录,webpack设置 context 默认值代码:

1
this.set("context", process.cwd());

process.cwd()即webpack运行所在的目录(等同package.json所在目录)。

context 应该配置为绝对路径,假如入口起点为src/main.js,则可以配置:

1
2
3
4
{
context: path.resolve('./src'),
entry: './main.js'
}

此时 entry 不能再配置为’./src/main.js’,因为 webpack 会相对于 context 配置的 src 目录区查找入口起点(main.js),而 main.js 就在此目录下,所以应当将 entry 配置为当前目录(./)。


context 有什么实际作用?官方文档的解释是使得你的配置独立于工程目录 「This makes your configuration independent from CWD (current working directory)」。怎么理解?举个例子,在分离开发生产配置文件时候,一般把 webpack.config 放到 build 文件夹下,此时 entry 却不用考虑相对于 build 目录来配置,仍然要相对于 context 来配置,这也就是所谓的独立于工程目录。


需要注意的是,output 的配置项和 context 没有关系,但是有些插件的配置项和 context 有关,后面会说明。


二、output

1、output.path

打包文件输出的目录,建议配置为绝对路径(相对路径不会报错),默认值和 context 的默认值一样,都是process.cwd()。除了常规的配置方式,还可以在 path 中用使用 [hash] 模板,比如配置:

1
2
3
4
output: {
path: path.resolve('./dist/[hash:8]/'),
filename: '[name].js'
}

这里的 hash 值是编译过程的 hash,如果被打包进来的内容改变了,那么 hash 值也会发生改变。这个可以用于版本回滚。为方便做持续集成等,你也可以配置:

1
2
3
4
output: {
path: path.resolve(`./dist/${Date.now()}/`),
filename: '[name].js'
}


阅读全文 »

nginx-rewrite

发表于 2018-04-10

一、ngx_http_rewrite_module

rewrite模块即ngx_http_rewrite_module模块,主要功能是改写请求URI,是Nginx默认安装的模块。

rewrite模块会根据PCRE正则匹配重写URI,或者直接返回资源(200|404),或者发起内部跳转再匹配location,或者直接做30x重定向返回客户端。

ngx_http_rewrite_module模块的指令有break, if, return, rewrite, set。

阅读全文 »
1…192021…27

chenoge

一个程序猿和一支笔的故事

267 日志
438 标签
© 2020 chenoge
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4