GloryLin


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

11th Day

发表于 2017-07-21

异步的原理:

  • 在每次执行函数的时候,给该函数传入一个callback(回调函数),在这个函数执行完了之后会执行,但不知道具体的执行时间,这是不可测的。
    • 异步是将回调函数加到队列里,按函数执行顺序加入,等编译器觉得时候合适了就调用,所以回调的执行是有顺序的,当前函数没执行完的时候是不会执行回调函数的
    • 同步的缺点是当前函数不执行完是不会执行下一个函数,如果设置了一个死循环,那这个网页就会卡死,接下来的所有操作都没有用
    • 不可以调用回调函数里返回的值,因为找不到这个值在哪,什么时候会形成

JSON

  • JSON是JS原生的,所以使用十分方便
  • 后台将数据访问接受后,通过res.json( {code:xxx, data:xxx, msg:xxx} )返回到前端页面,让前端处理
1
2
3
4
5
6
var a = JSON.stringify({name:"123",age:12});
=> '{"name":"123","age":12}'
//将对象解析为字符串
JSON.parse(a);
=> Object {name: "123", age: 12}
//将字符串转化为对象,把字符串在JSON.parse中调用必须严格按照转化程字符串的格式输入:JSON.parse('{"name":"123","age":12}')
  • 对后台而言,JSON中使用的是将数据返回给前端:res.json( { } ),将前端发来的数据解析:JSON.parse( )、JSON.stringify( )

9th Day

发表于 2017-07-18

事件驱动程序

Node.js使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户

1
2
3
4
5
var events = require('events');
var eventEmitter = new events.EventEmitter();
eventEmitter.on('xxx',xxx);
eventEmitter.emit('xxx');
eventEmitter.removeListener('xxx', xxx);

加载events模块,实例化EventEmitter类
用.on绑定事件,第一个参数是事件的名称,第二个参数是触发后执行的函数(监听器),该函数可以是匿名函数
用.emit触发事件,参数是事件的名称(监听器)
用.removeListener来移除某个事件

阅读全文 »

Blog Summary

发表于 2017-07-17

Web常用

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
req.body.xxx //获取页面body里的参数
res.render('xx') //将页面渲染到xx里
req.query.xxx; //获取页面URL中带的参数
res.render('detail',{
blogs: result[0]
}); //渲染页面并传入参数,通过在数据库中查询得到的result是数组,不用result[0]传入,将显示Object对象
<%= blog.content %> //在ejs中接收数据
<% blogs.forEach(blog => { %>
<li>
<a href="/detail?blog_id=<%= blog.id %>"><%= blog.title %></a>
</li>
<% }) %>
</ul> //这种情况是将result直接传入,由于blogs是数组,所以用遍历forEach
//其中a标签中设置了带blog的id跳转
module.exports = {
insertData:insertData,
selectData:selectData,
selectDataContent:selectDataContent
}; //同一个JS中暴露多个函数,
var selectData = require('../tools/db').selectData;
var selectDataContent = require('../tools/db').selectDataContent; //调用暴露的多个函数
阅读全文 »

未命名

发表于 2017-07-17

title: 8th Day
date: 2017-07-17 14:25:35

tags: [daily]

成为唯一标识符

1
2
3
4
5
6
7
8
function S4() {
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
function guid() {
return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
}
var myID = "static" + guid();
console.log(myID)
  • 调用这段代码即可生成一组特殊的标识符作为ID
阅读全文 »

4th Day

发表于 2017-07-13

Mongo的命令

  • 集合:表格
  • 文档:行
  • 字段:列
1
2
3
4
5
6
7
8
9
10
11
12
13
db 显示当前在哪个数据库里
show dbs 显示所有数据库
show tables 显示当前数据库里的表
use + dbname 进入数据库
db.dropDatabase 删除当前数据库
db.dbname.insert({ 内容 }) 在数据库里创建一个dbname表,并存入数据
db.dbname.drop() 删除dbname的表
db.dbname.find() 查看dbname表里的所有文档的信息
db.dbname.update({原本的信息},{$set:{更新的信息}}) 更新dbname表里的信息,选填三个信息,1:如果匹配不上信息,是否创建一个新的,默认为false;2:若匹配上了多个信息,是否更改所有,默认是false;3:抛出异常的级别
db.dbname.update({属性:{$ gt:判断条件}},{$set:{更新的信息}},false,true) 更新dbname表里的该属性所有信息
db.dbname.remove({匹配的属性}) 选填,不填删除所有配对的信息,填1删除找到的第一条信息
db.dbname.remove({属性:{$ gt:判断条件}} 删除所有该属性
db.DB.find({匹配属性,匹配的属性}) 查询当前匹配条件信息
  • 可以用use + dbname 新创建一个数据库,但不会马上显示出来;
  • MongoDB会自己创建数据库和集合,不用手动创建
阅读全文 »

3rd Day

发表于 2017-07-12

中间件

  • 页面发送请求,经过中间件,到服务器;服务器再将响应传回页面
  • 中间件相当于黑箱操作,在箱子里经过一系列的函数操作,到达目的地,也可以在进行某个中间件操作的时候判断是否符合条件,可以调至下一个中间件或直接到终点

利用中间件构建一个简易Express

路由的匹配

1
2
3
4
5
6
7
8
9
10
11
12
var isMatch = (reqUrl, targetPath) => {
var targets = targetPath.split('/').filter(e => e != '');
return url.parse(reqUrl).pathname.split('/').filter(e => e != '').every((subUrl, idx) => {
if (idx >= targets.length){
return true;
} else {
return subUrl === targets[idx]
}
});
}
  • 利用箭头函数传入参数,用split和filter把空格和‘/’去掉,然后请求路由和目标路由匹配
阅读全文 »

未命名

发表于 2017-07-12

title: 2nd Day
date: 2017-07-12 19:02:58

tags: [daily]

异步和同步

  • 同步:按顺序执行,单程
  • 异步:有回调函数,cb;所以会比其他函数处理慢,同时进行,多程

render.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function makeATag(link,fileSize){
return `<a href="${link}">${link} fileSize:${fileSize}</a>`
}
module.exports = function(list,fileSize){
var i = 0;
var html = '<h1>It Is A Diretory, File List Is: </h1>';
html += '<ul>'
html += `<li> ${makeATag('../')} </li>`;
for (i = 0; i < list.length; i++){
html += `<li> ${makeATag(list[i],fileSize[i])} </li>`;
}
html += '</ul>'
return html;
}
  • $对应传入的参数,在a标签中用传入的参数值
  • 将路径拼接,形成跳转
  • 此处设置跳转,使文件列举后可以点击进入查看里面的内容;module.exports使该函数暴露,可以在fileServer中加载该js
阅读全文 »

1st day

发表于 2017-07-11

Git命令行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
git clone #克隆github的库到本地
git add index.html #为把文件添加做准备
git status #查看当前状态(红色应add,绿色即可push)
git log #查看修改日志
git commit -m "字符串" # 为文件push准备,字符串内容将在log的日志中显示
git push origin master #将文件上传到github
git pull origin master #将文件从github下载到本地,每次上传新的文件前都先pull再push
cat index.html #查看文件内容
vim index.html #新创建一个文件,按i后才能输入,按esc,按:wq保存并退出
cd f:/文件名 #直接进入某个盘的某个文件夹
cd + 文件名 #进入某个文件
ls #列举当前目录下的文件
pwd #显示当前路径
mkdir #创建文件夹
rm + 文件 #删除某个文件
rm + 文件夹 -r #删除某个文件夹
hexo new 标题 #创建一个md
hexo generate #将该目录下增加的或修改的md加载
hexo deploy #部署到网页
hexo server #部署到本地

Mysql

发表于 2017-07-10

数据的遍历

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
private static void listBook2() throws Exception {
Connection con = dbUtil.getCon(); // 获取连接
String sql = "select * from t_book";
PreparedStatement pstmt = con.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery(); // 返回结果集ResultSet
while (rs.next()) {
int id = rs.getInt("id"); // 获取第一个列的值 编号id
String bookName = rs.getString("bookName"); // 获取第二个列的值 图书名称 bookName
float price = rs.getFloat("price"); // 获取第三列的值 图书价格 price
String author = rs.getString("author"); // 获取第四列的值 图书作者 author
int bookTypeId = rs.getInt("bookTypeId"); // 获取第五列的值 图书类别id
System.out.println("图书编号:" + id + " 图书名称:" + bookName + " 图书价格:"
+ price + " 图书作者:" + author + " 图书类别id:" + bookTypeId);
System.out
.println("=============================================================");
}
}//第一种方法
private static List<Book> listBook3()throws Exception{//List是一个泛型,返回一个对象
List<Book> bookList=new ArrayList<Book>(); //相当于建立了一个数组
Connection con = dbUtil.getCon(); // 获取连接
String sql = "select * from t_book";
PreparedStatement pstmt = con.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery(); // 返回结果集ResultSet
while (rs.next()) {
int id = rs.getInt("id"); // 获取第一个列的值 编号id
String bookName = rs.getString("bookName"); // 获取第二个列的值 图书名称 bookName
float price = rs.getFloat("price"); // 获取第三列的值 图书价格 price
String author = rs.getString("author"); // 获取第四列的值 图书作者 author
int bookTypeId = rs.getInt("bookTypeId"); // 获取第五列的值 图书类别id
Book book=new Book(id, bookName, price, author, bookTypeId);//创建一组数据
bookList.add(book);//相当于往数组里传值
}
return bookList;
}//第二种方法
public static void main(String[] args) throws Exception {
listBook2();//第一种方法的调用
List<Book> bookList=listBook3();
for (Book book : bookList) {
System.out.println(book);//此处需要在Book类中重写toString方法,因为传入输出的是对象
}//第二种方法的调用
}
public String toString() {
return "["+this.id+","+this.bookName+","+this.price+","+this.author+","+this.bookTypeId+"]";
}

blog

发表于 2017-07-10

这是一个技术博客。

1…345
RY Lin

RY Lin

努力活成你喜欢的样子

41 日志
8 标签
GitHub
破站访问量:
© 2020 RY Lin
由 Hexo 强力驱动
主题 - NexT.Muse