最新文章
最初是 TJ 2013年写的模块。可以使用redis或者内存模式。当一定的时间内请求次数超过阀值,返回429错误。可以参考 API Rate Limiting 限速 https://javascript.net.cn/article?id=623,这个是基于IP的。在nginx做代理的情况下,还可以基于IP或者请求再次限流 https://javascript.net.cn/article?id=753Installation 安装# npm
$ npm install koa-ratelimit
# yarn
$ yarn add koa-ratelimit
Example 例子Wi
跨域脚本攻击 XSS 是最常见、危害最大的网页安全漏洞。XSS:Cross Site Scrit 跨站脚本攻击(为与 CSS 区别,所以在安全领域叫 XSS)。攻击原理是代码被恶意注入到页面中(例如评论),然后其他用户在访问页面时,浏览器执行了代码逻辑。为了防止它们,要采取很多编程措施,非常麻烦。很多人提出,能不能根本上解决问题,浏览器自动禁止外部注入恶意脚本?这就是"网页安全政策"(Content Security Policy,缩写 CSP)的来历。CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提
display:inline-block是一种布局方法,它相比于与浮动、定位最大的不同就是其没有父元素的匿名包裹特性,这使得display:inline-block属性的使用非常自由,可与文字,图片混排,可内嵌block属性元素,可以置身于inline水平的元素中。在CSS布局中,如果我们想要将一些元素在同一行显示,其中的一种方法就是把要同行显示的元素设置display属性为inline-block。但是你会发现这些同行显示的inline-block元素之间经常会出现一定的空隙,这就是“换行符/空格间隙问题”。 !DOCTYPE html
html
head
title
怪异模式(quirks mode)是指在计算机领域中,一些网页浏览器为了维持对较旧的网页设计的向后兼容性,而使用的一种技术。怪异模式特点:1.采用的是IE盒模型,即将border和padding包含在了height和width中。在 IE 盒模型中,box width = content width + padding left + padding right + border left + border right,
box height = content height + padding top + padding bottom + border top + border bottom
一,响应式网页设计响应式网页设计( RWD,Responsive Web Design) 这个术语,由伊桑・马科特( Ethan Marcotte )提出。他在AList Apart发表了一篇开创性的文章,将三种已有的开发技巧(弹性网格布局、弹性图片、媒体和媒体查询)整合起来,并命名为响应式网页设计。这个术语还有一堆表示相同意思的其他叫法,如流式设计、弹性布局、塑料布局、流体设计、自适应布局、跨设备设计以及弹性设计。 上面仅列举了其中一部分!不过,正如马科特等人所说,真正的响应式设计方法不仅仅只是根据视口大小改变网页布局。相反,它是要从整体上颠覆我们当前设计网页的方法。以往我们先是针对桌面电
1,DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。2,表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。3,Truncate table 表名 速度快,而且效率高,因为: truncate table 在功能上与不带 WHE
商品库存肯定是很有限的,如何控制库存不让出现超买是一个非常重要的问题。事务是控制库存超卖的必要不充分条件。举例:总库存:4个商品请求人:a、购买1个商品 b、购买2个商品 c、购买3个商品程序如下:beginTranse
try{
result = db- query('select amount from s_store where postID = 12345');
if(result- amount 0){
//quantity为请求减掉的库存数量
db- query('update s_store set amount = amount - qua
assert 模块assert模块是Node的内置模块,主要用于断言。如果表达式不符合预期,就抛出一个错误。该模块提供11个方法,但只有少数几个是常用的。assert(value[, message])value any 检查是否为真的输入。message string | Error assert.ok() 的别名。assert.ok(value[, message])如果 value 不是真值,则抛出 AssertionError,并将 message 属性设置为等于 message 参数的值。 如果未定义 message 参数,则会分配默认错误消息。 如果 message 参数
使用 Mocha 和 Node.js自带的assert做单元测试,使用SuperTest做请求接口。Mocha 简介mocha 提供 TDD(测试驱动开发)、BDD (行为驱动开发) 和 exports 风格的接口。BDD是“行为驱动的开发”(Behavior-Driven Development)的简称。BDD认为,不应该针对代码的实现细节写测试,而是要针对行为写测试。BDD测试的是行为,即软件应该怎样运行。BDD接口提供以下方法:describe():测试套件
it():测试用例
before():所有测试用例的统一前置动作
after():所有测试用例的统一后置动作
beforeEach
NPM Package 学习,一个符合CommonJs规范的包,都可以成为一个Npm Package。一,创建一个包创建一个文件夹:good-helloworld添加如下文件:index.jsexports.helloWorld = function () {
return "Hell World!";
}
exports.你好世界 = function () {
return "你好世界!";
}
package.json{
"name": "good-helloworld",
"version": "0.0.1",
"private": false
}
README.
Sequelize 提供了一个方法 Model.bulkCreate,可以只用一次查询插入多条数据。bulkCreate(records, [options]) - Promise. Array. Instance
参数records Array 要创建实例的对象(键/值 对)列表
[options] Object
[options.fields] Array 要插入的字段。默认全部
[options.validate=true] Boolean 插入每条记录前进行验证
[options.hooks=true] Boolean 在执行前/后创建钩子
[options.indi
安装 node-xlsxnpm install node-xlsx --save读取 Excelvar xlsx = require('node-xlsx');
// 解析得到文档中的所有 sheet
var sheets = xlsx.parse('test.xls');
// 遍历 sheet
sheets.forEach(function(sheet){
console.log(sheet['name']);
// 读取每行内容
for(var rowId in sheet['data']){
console.log(rowId);
正向代理与反向代理的区别就是代理的对象不一样,正向代理代理的对象是客户端,反向代理代理的对象是服务端。1,正向代理我们日常的科学上网就可以用Nginx做正向代理如下,也是正向代理server {
location / {
proxy_pass http://$http_host$request_uri;
}
}
2,反向代理配置语法:Syntax:proxy_pass URLDefault:--Context:location,if inlocation,limit_except如下:server {
location ~ /test_ind
tags字段是逗号隔开tag id。查询一select
i.id,
i.title,
i.tags,
(select
GROUP_CONCAT(tb_tag.title SEPARATOR ',')
from tb_tag where id in (i.tags)
) as tags_title
from tb_item as i;
结果:查询二select
i.id,
i.title,
i.tags,
(select
GROUP_CONCAT(tb_tag.title SEPARATOR ',')
fro
OSS可以通过阿里云STS(Security Token Service)进行临时授权访问。通过STS,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。使用场景对于您本地身份系统所管理的用户,例如您的App的用户,将这部分用户称为联盟用户。通过阿里云STS服务为阿里云账号(或RAM用户)提供临时访问权限管理。您不需要透露云账号(或RAM用户)的长期密钥(如登录密码、AccessKey),只需要生成一个临时访问凭证给联盟用户使用即可。这个凭证的访问权限及有效期限都可以由您自定义。您不需要关心权限撤销问题,临时访问凭证过期后会自动失效。实现原理以一个移
可选链操作符( ?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空(nullish ) (null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。之前:let nestedProp = obj.first && obj.first.second;
使用可选链操作符?.let nestedProp = obj.first?.second;
连用可选链操作符let
.head-section{
width: 100%;
height: 360px;
position: relative;
z-index: -1;
overflow: hidden;
}
.head-section::after{
content: '';
display: block;
width: 160%;
height: 200%;
border-radius: 50%;
position: absolute;
left: 50%;
top: -10
2020年12 月 8 日,CentOS 项目宣布,CentOS 8 将于 2021 年底结束,而 CentOS 7 将在2024年,其生命周期结束后停止维护。为其接班的正是 CentOS Stream 滚动发行版本,原本拥有 10 年支持的 CentOS 8 将在2021年年底说结束维护就结束维护。所以火速将自己的服务器从 CentOS8 降到 CentOS 7。mkdir /space
cd /space
wget https://nginx.org/download/nginx-1.18.0.tar.gz
yum -y install gcc pcre pcre-devel zl
通常异常使用方式:try {
JSON.parse(json);
} catch (e) {
// TODO
}
但是这对于异步编程而言并不一定适应,下面的代码 catch 不会捕捉到异常,并导致程序退出:async function action(){
setTimeout(()= {
throw new Error("发生了错误");
}, 1000);
}
try {
action();
} catch (e){
console.log('catch: ', error.message);
}
异步I/O的实现主要包含两个阶段:提交请求和处理结果。这
所有标签