-
Express中的app.use的一些用法
2020-09-23 16:32:30express中的app.use的用法 在Express框架中,有一个 加载第三方模块插件 加载路由 1. 加载静态区域 1. 使用拦截器express中的app.use的用法
在Express框架中,有一个app.use() 这个方法在经常使用,好么,它到底有什么作用呢
加载第三方模块插件
//配post请求
const bodyParser = require(“body-parser”); //导入了第三方插件
//加载了第三方插件模块
app.use(bodyParser.urlencoded({ extended: false, limit: “30mb” }));
app.use(bodyParser.json({ limit: “30mb” }))加载路由
1
.app.use("/stuInfo",require("./routes/StuInfoRouter.js"));加载静态区域
1
.app.use("/public", express.static(path.join(__dirname, “./public”)));使用拦截器
在所有请求之前(也就是所有路由之前去拦截)
app.use((req,resp,next)=>{
//所有经过路由的请求就会先到达这里被拦下来,如果想放行,直接调用next()
});配合 express-async-errors处理全局异常
const express = require("express"); require("express-async-errors");
//后面这段代码一定要写在路由后面
//服务器报错以后500app.use((error, req, resp, next) => { if (req.xhr) { resp.json({ status: "fail", msg: "服务器错误" }); } else { console.log(error); //只有报错才会进这里 resp.render("status/500"); } });
关于Ajax的一些补充
get请求
get请求的页面代码
function getData() { // new ActiveXObject("Micorsoft.XMLHTTP"); var xhr = new XMLHttpRequest(); xhr.open("get", "/getAjax1?userName=biaogege", true); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (xhr.status == 200 || xhr.status == 304) { console.log(xhr.responseText); } } } xhr.send(); }
get请求的后台代码
app.get("/getAjax1", (req, resp) => { console.log(req.query); resp.json({ status: "success", msg: "请求成功" }); });
post请求
post请求的页面代码
function getData() { var userName = "biaogege"; var xhr = new XMLHttpRequest(); xhr.open("post", "/postAjax2", true); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (xhr.status == 200 || xhr.status == 304) { console.log(xhr.responseText); } } } // 如果post要发送值,一定要在send里面 xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); xhr.send("userName=biaogege"); }
后台代码
//配post请求 后台请求一定要配置 const bodyParser = require("body-parser"); app.use(bodyParser.urlencoded({ extended: false, limit: "30mb" })); app.use(bodyParser.json({ limit: "30mb" })); app.post("/postAjax2", (req, resp) => { console.log(req.body); resp.json({ status: "success", msg: "请求成功" }); });
这个时候我们可以明显的发现,post表求有Ajax代码有很多不一样
1.
它在请求之前一定要设置一个请求头xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
2.
它的数据是通过xhr.send("userName=biaogege");
,不像get那样,直接拼在了url地址的后面重要:
关于post请求,因为是可以设置RequestHeader 这个东西的,所以在传递数据的时候,我们可以不使用拼接的方式,直接传递一个JSON字符串过去,只要后台做了解析的就可以了
后台的配置
//配post请求 后台请求一定要配置 const bodyParser = require("body-parser"); //这一行代码是解析application/x-www-form-urlencoded app.use(bodyParser.urlencoded({ extended: false, limit: "30mb" })); //这一行代码就是解析application/json app.use(bodyParser.json({ limit: "30mb" }));
页面上面的请求方式
function getData() { var obj = { userName: "张三", age: 17, sex: "男" } var xhr = new XMLHttpRequest(); xhr.open("post", "/postAjax3", true); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (xhr.status == 200 || xhr.status == 304) { console.log(xhr.responseText); } } } // 如果post要发送值,一定要在send里面 // xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(JSON.stringify(obj)); }
在上面的代码过程当中, 我们在向后台直接 xhr.send(JSON.stringify(obj)); 发送了一个JSON字符串,并且我们把请求头设置为了xhr.setRequestHeader(“Content-Type”, “application/json”); 后台服务器只要是做了相关的配置,就可以直接把这个POST过去的JSON字符串转换成一个对象
Ajax的跨域
Ajax的请求默认情况下是不可以跨域的
什么是域?什么是跨域?域指的是origin,跨域指的源地址的域与请求目标地址域不相同,这样就叫域
如下所示
源地址:
http://127.0.0.1:5500/ajax1.html
目标地址:http://192.168.9.254:81/getAjax1?userName=biaogege
这样源地址的域是
http://127.0.0.1:5500
,而目标地址的域是http://192.168.9.254:81
。两个地址的域不相同,这样就叫跨域而Ajax默认是不允许跨域的(受同源策略的影响,这是浏览器的限制,浏览器不允许不同的域之间交互数据),如果发生跨域请求,则会报错误
Aajx如果想实列跨域获取数据,则一定要后台开始`CORS
跨域资源共享CORS
CORS:
corss origin resource share
,它是在服务端设置的resp.setHeader(“Access-Control-Allow-Origin”,"*");
resp.setHeader(“Access-Control-Allow-Methods”,“GET,POST,PUT,DELETE,OPTIONS”);
resp.setHeader(“Access-Control-Allow-Headers”,“Content-Type”);解决跨域除了上面的方式以外,还有另外的几种方式列举一下
CORS
跨域资源共享jsonp
nginx
反向代理
-
use关键字在PHP中的几种用法
2020-04-09 18:02:00use关键字在PHP中的几种用法在学习了和使用了这么多年的PHP之后,您知道use这个关键字在PHP中都有哪些用法吗?今天我们就来看一下它的三种常见用法。1. 用于命名空间的别名引用//...use关键字在PHP中的几种用法
在学习了和使用了这么多年的PHP之后,您知道use这个关键字在PHP中都有哪些用法吗?今天我们就来看一下它的三种常见用法。
1. 用于命名空间的别名引用
// 命名空间 include 'namespace/file1.php'; use FILE1\objectA; use FILE1\objectA as objectB; echo FILE1\CONST_A, PHP_EOL; // 2 $oA = new objectA(); $oA->test(); // FILE1\ObjectA $oB = new objectB(); $oB->test(); // FILE1\ObjectA
这个想必在日常的工程化开发中会非常常见。毕竟现在的框架都是使用了命名空间的,不管做什么都离不开各种类依赖的调用,在各种控制器文件的上方都会有大量的use xxx\xxx\xxx;语句。
2. 用于trait特性能力的引入
// trait trait A{ function testTrait(){ echo 'This is Trait A!', PHP_EOL; } } class B { use A; } $b = new B(); $b->testTrait();
即使在最近这两年,依然还是见过完全没有用过trait的PHP程序员,不要惊讶,这是真实存在的。想想还有那么多项目都还在用TP3也就不奇怪了。trait特性还是非常方便的一种类功能扩展模式,其实我们可以看作是将这个use放在了类中就成为了trait的引用定义了。
3. 匿名函数传参
// 匿名函数传参 $a = 1; $b = 2; // function test($fn) use ($a) // arse error: syntax error, unexpected 'use' (T_USE), expecting '{' function test($fn) { global $b; echo 'test:', $a, '---', $b, PHP_EOL; // test:---2 $fn(3); } test(function ($c) use ($a) { echo $a, '---', $b, '---', $c, PHP_EOL; }); // 1------3
这个就有点意思了吧,方法中要调用外部的变量是需要global的,在这里我们直接通过use()也是可以将变量传递过去的。而且这个仅限于在匿名函数中使用。
测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/source/use%E5%85%B3%E9%94%AE%E5%AD%97%E5%9C%A8PHP%E4%B8%AD%E7%9A%84%E5%87%A0%E7%A7%8D%E7%94%A8%E6%B3%95.php
-
rust多个属性宏叠加_Rust 1.7.0 macro宏的复用 #[macro_use]的用法
2020-12-29 00:30:28Rust 1.7.0 中的宏使用范围包括三种情况:第一种情况是宏定义在当前文件中,这个文件可能是 crate 默认的 module,也可能是任意的 module 模块。第二种情况是宏定义在当前 crate ,但是不是在当前文件中,而是其他 ...Rust 1.7.0 中的宏使用范围包括三种情况:
第一种情况是宏定义在当前文件中,这个文件可能是 crate 默认的 module,也可能是任意的 module 模块。
第二种情况是宏定义在当前 crate ,但是不是在当前文件中,而是其他 module 模块中。
第三种情况是宏定义在其他的 crate 中,或者其他的 crate 子模块中。
使用#[macro_use] 可以使被注解的module模块中的宏应用到当前作用域中;或者注释crate中的宏应用到当前crate作用域中。
第一种情况的例子:
macro_rules! say_hello{
()=>(
println!("Hello");
)
}
fn main(){
say_hello!();
}
第二种情况:
先创建一个新文件 macros.rs ,定义一个宏 say_bonjour
macro_rules! say_bonjour{
()=>(
println!("Bonjour");
)
}
使用
#[macro_use]
pub mod macros;
macro_rules! say_hello{
()=>(
println!("Hello");
)
}
fn main(){
say_hello!();
say_bonjour!();
}
如果没有 #[macro_use] 编译会出现
error: macro undefined: ‘say_bonjour!’
第三种情况:注释在外部 crate 的语句
创建 log 项目 cargo new log
在 log 项目中,lib.rs 是入口,在lib.rs中定义 macors 模块。
...#[macro_use] mod macros; . . .
然后,创建对应mod macros 的 macros.rs 文件 vi src/macros.rs
声明宏 log、error、warn、info,在每个宏定义前面添加 #[macro_export]注释,表示这些宏可以被外部的 crate 使用。
.
.
.
#[macro_export]
macro_rules! log {
...
}
#[macro_export]
macro_rules! error {
(target: $target:expr, $($arg:tt)*) => (
log!(target: $target, $crate::LogLevel::Error, $($arg)*);
);
($($arg:tt)*) => (
log!($crate::LogLevel::Error, $($arg)*);
)
}
#[macro_export]
macro_rules! warn {
(target: $target:expr, $($arg:tt)*) => (
log!(target: $target, $crate::LogLevel::Warn, $($arg)*);
);
($($arg:tt)*) => (
log!($crate::LogLevel::Warn, $($arg)*);
)
}
#[macro_export]
macro_rules! info {
(target: $target:expr, $($arg:tt)*) => (
log!(target: $target, $crate::LogLevel::Info, $($arg)*);
);
($($arg:tt)*) => (
log!($crate::LogLevel::Info, $($arg)*);
)
}
.
.
.
使用:引入 log crate的时候,注明#[macro_use]
#[macro_use]
extern crate log;
.
.
.
if !shutdown.load(Ordering::SeqCst) {
info!("ConnectionHandler: read timed out ({:?}). Server not shutdown, so \ retrying read.",
err);
continue;
} else {
info!("ConnectionHandler: read timed out ({:?}). Server shutdown, so \ closing connection.",
err);
break;
}
.
.
.
-
Rust 1.7.0 macro宏的复用 #[macro_use]的用法
2016-03-26 22:05:00第一种情况是宏定义在当前文件中,这个文件可能是 crate 默认的 module,也可能是任意的 module 模块。 第二种情况是宏定义在当前 crate ,但是不是在当前文件中,而是其他 module 模块中。 第三种情况是宏定义在...Rust 1.7.0 中的宏使用范围包括三种情况:
第一种情况是宏定义在当前文件中,这个文件可能是 crate 默认的 module,也可能是任意的 module 模块。
第二种情况是宏定义在当前 crate ,但是不是在当前文件中,而是其他 module 模块中。
第三种情况是宏定义在其他的 crate 中,或者其他的 crate 子模块中。使用#[macro_use] 可以使被注解的module模块中的宏应用到当前作用域中;或者注释crate中的宏应用到当前crate作用域中。
第一种情况的例子:
macro_rules! say_hello{ ()=>( println!("Hello"); ) } fn main(){ say_hello!(); }
第二种情况:
- 先创建一个新文件 macros.rs ,定义一个宏 say_bonjour
macro_rules! say_bonjour{ ()=>( println!("Bonjour"); ) }
- 使用
#[macro_use] pub mod macros; macro_rules! say_hello{ ()=>( println!("Hello"); ) } fn main(){ say_hello!(); say_bonjour!(); }
如果没有 #[macro_use] 编译会出现
error: macro undefined: ‘say_bonjour!’
第三种情况:注释在外部 crate 的语句
创建 log 项目
cargo new log
在 log 项目中,lib.rs 是入口,在lib.rs中定义 macors 模块。
. . . #[macro_use] mod macros; . . .
然后,创建对应mod macros 的 macros.rs 文件 vi src/macros.rs
声明宏 log、error、warn、info,在每个宏定义前面添加 #[macro_export]注释,表示这些宏可以被外部的 crate 使用。. . . #[macro_export] macro_rules! log { ... } #[macro_export] macro_rules! error { (target: $target:expr, $($arg:tt)*) => ( log!(target: $target, $crate::LogLevel::Error, $($arg)*); ); ($($arg:tt)*) => ( log!($crate::LogLevel::Error, $($arg)*); ) } #[macro_export] macro_rules! warn { (target: $target:expr, $($arg:tt)*) => ( log!(target: $target, $crate::LogLevel::Warn, $($arg)*); ); ($($arg:tt)*) => ( log!($crate::LogLevel::Warn, $($arg)*); ) } #[macro_export] macro_rules! info { (target: $target:expr, $($arg:tt)*) => ( log!(target: $target, $crate::LogLevel::Info, $($arg)*); ); ($($arg:tt)*) => ( log!($crate::LogLevel::Info, $($arg)*); ) } . . .
使用:引入 log crate的时候,注明#[macro_use]
#[macro_use] extern crate log; . . . if !shutdown.load(Ordering::SeqCst) { info!("ConnectionHandler: read timed out ({:?}). Server not shutdown, so \ retrying read.", err); continue; } else { info!("ConnectionHandler: read timed out ({:?}). Server shutdown, so \ closing connection.", err); break; } . . .
-
use 在php 用法中的总结
2017-07-03 16:15:001.命名空间 2.匿名函数 3.多继承 4.暂时想到这三个,如果有请补充在评论区 转载于:https://www.cnblogs.com/datang6777/p/7111683.html -
TP5 namespace 和 use 的用法
2017-04-14 17:11:35PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算...为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。 参考来源:... -
php中namespace和use的用法
2016-06-28 10:55:15PHP的主要优势有: ...命名空间不能嵌套或在同一代码处声明多次(只有最后一次会被识别),但是,你能在同一个文件中定义多个命名空间的代码,比较合适的做法是每一个文件定义一个命名空间(可以是相同命名空间)。 -
robot framework中和screenshot有关的三个关键字的用法解析
2016-01-25 19:06:27在robot framework中 和屏幕截图有关的共有三个关键字,分别是: 1)Name:Set Screenshot Directory Source:Screenshot Arguments:[ path ] Sets the directory where screenshots are saved. It is possible to ... -
ORDERED 和 USE_NL() hint (zt)的用法
2013-08-27 15:12:08发现把这三个table PO_AGENTS PA, PER_PEOPLE_F PAPF,HR_LOCATIONS_ALL_TL HL 串起来后语句执行的像蜗牛一样慢啊,用户每次跑个报表是都会抱怨说在挑选参数时太慢。不得不优化语句啊。后来想用用oralce 的优化器... -
thinkphp3.2 namespace及use用法
2015-01-10 09:42:00PHP 5.3中的namespace其实是个不错的东西,可以简化编程,下面介绍三类在代码中访问namespace中类的方法1 引用namespace和类 假设namespace的程序为namespaced-class.phpnamespace Christmas\DaysOf;class ... -
python三种运算符_Python 海象运算符 (:=) 的三种用法
2020-12-08 11:03:09“Python猫” ,一个值得加星标的公众号 剧照 | 《犬夜叉》 原标题 |Three Ways to Use the Walrus Operator in Python作 者 |Jonathan Hsu翻 译 |人气呆毛选手来 源|AI 开发者随着Python 3.8的发布,赋值表达式... -
python海象运算符_Python 海象运算符 (:=) 的三种用法
2020-11-28 16:47:26原标题 |Three Ways to Use the Walrus Operator in Python作 者 |Jonathan Hsu翻 译 |人气呆毛选手审 校 | 鸢尾、唐里注:敬请点击文末【阅读原文】访问文中相关链接,PC查看体验更佳。随着Python 3.8的发布,... -
mysql %的用法_mysql的用法
2021-01-27 09:42:35绝不要用一个关键字命名表或者列三.USE关键字,不显示任何结果,依赖于使用的客户机显示某种形式的通知;记住必须使用USE打开数据库,才能读取其中的数据。四.show databases 返回可用数据可的一个列表;为了获得... -
mysql的用法
2019-07-04 11:04:00三.USE关键字,不显示任何结果,依赖于使用的客户机显示某种形式的通知;记住必须使用USE打开数据库,才能读取其中的数据。 四.show databases 返回可用数据可的一个列表; 为了获得数据库内的表的列表,使用show ... -
三态门及数据缓冲器 双向口的用法
2013-08-05 20:28:001、三态门指逻辑门电路的输出不仅有高电平、低电平,还有高阻态 它有一个使能控制端EN ,一个数据输入端DATAIN和一个数据输出端DATAOUT 2、单总线缓冲器 它通常由多个三态门组成, 3、双向总线缓冲器 library ... -
php namespace和use的使用
2020-11-25 10:38:01用过CMS的同学都知道,很多CMS都会采用面向对象编程的思想,会遇到很多namespace和use,今天来简单介绍一下php中命名空间和use的使用 namespace和use ...三个文件都在同一个目录下 # class_test1.php <?ph -
用法 the_冠词 “the” 的用法
2021-01-12 09:22:55要想说一口流利而准确的英语,掌握定冠词 “the” 的使用方法非常重要...下面我们学习一下关于 “the” 的三个实用知识点。 Three facts about 'the' 1 We use“the”when referring to a specific thing and both y... -
mysql中模糊查询的四种用法介绍
2021-01-19 22:24:27下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。 比如 SELECT * FROM [user] WHERE u_name LIKE ‘%三%’ 将会... -
UIScrollView 的基本用法
2014-02-14 17:26:00iPhone/iPad中UIScrollView还是经常要用到的,这里作了一个使用它最简单的例子,一个ScrollView中放了三个UIView。这三个 UIView分别设置了不同的背景色,它们在 ScrollView中可以一页一页的滚动。 这段代码放在 ... -
shell下的seq用法
2012-07-26 14:14:56linux下seq的用法: ...它有三个选项 -f, --format=FORMAT use printf style floating-point FORMAT (default: %g) -s, --separator=STRING use STRING to separate numbers (default: \n) -w, --equal-wi... -
蓝桥--linux--Mysql--基础用法整理(三)数据库及表的修改与删除
2020-05-08 18:15:41重命名表语句有三种形式,效果是一样的: RENAME TABLE 原名 TO 新名字; ALTER TABLE 原名 RENAME 新名字; ALTER TABLE 原名 RENAME TO 新名字; 进入数据库mysql_shiyan: use mysql_shiyan 使用命令修改... -
layui(三)——laypage组件常见用法总结
2019-10-08 22:46:28laypage 的使用非常简单,指向一个用于存放分页的容器,通过服务端得到一些初始值,即可完成分页渲染。核心方法:laypage.render(options)来设置基础参数。 一、laypage的常用基础参数 layui.use(['laypage'], ... -
MySQL用法实战 #电商数据库 #如何拆表 #从拆表到表的设计规范 #军规 #第三部分
2019-10-26 12:12:33MySQl高级用法实战一、创建一个电商数据表1)创建数据库数据表2)插入数据3)练习各类sql 语句4)拆开这张表 创建一个电商数据库 一、创建一个电商数据表 1)创建数据库数据表 create database shop charset=utf8; ... -
use-spotify:Spotify Web API的React挂钩-源码
2021-02-14 14:24:45第三个参数是Spotify方法特有的参数列表。 有关每种方法及其参数的更多文档,请参见文档或。 const result = useSpotify ( spotifyMethod , options , ... args ) const [ invoke , result ] = useSpotify -
MySQL存储过程的简单用法
2015-11-21 17:00:09传入三个整形参数,求他们的和,用第三个参数作为返回 DELIMITER $$ USE `school`$$ !-- 选择表名 DROP PROCEDURE IF EXISTS `proc_2`$$ !-- 设置存储过程的名字 CREATE DEFINER=`root`@`localhost` ... -
蓝桥--linux--Mysql--基础用法整理(三)数据库及表的修改与删除(转载)
2020-07-10 17:49:55重命名表语句有三种形式,效果是一样的: RENAME TABLE 原名 TO 新名字; ALTER TABLE 原名 RENAME 新名字; ALTER TABLE 原名 RENAME TO 新名字; 1 2 3 4 5 进入数据库mysql_shiyan: use mysql_shiyan 1 使用命令... -
值传递和引用传递,以及const在函数中的用法
2018-12-19 16:14:44简述 理解值传递与引用传递,可以提高...下文将分成难度递增的三个阶段,来记录值传递、引用传递和const修饰符在函数中的用法。 level 1–值传递与引用传递 1、值传递 主调函数向调用函数传递参数实际上只是将实参... -
【转】SQL中where, group by, having的用法和区别
2020-11-20 15:10:57为了回答这个问题,将这个三个关键字的用法整理一下。 where:数据库中常用的是where关键字,用于在初始表中筛选查询。它是一个约束声明,用于约束数据,在返回结果集之前起作用。如下面这个例子,从user表中查询出...