1.命名空间
2.匿名函数
3.多继承
4.暂时想到这三个,如果有请补充在评论区
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
反向代理
php use()方法
PHP命名空间支持三种别名方式(或者说引用):
1、为一个类取别名
2、为一个接口取别名
3、为一个命名空间取别名 这三种方式都是用 use 关键字来完成
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;
}
.
.
.
1.命名空间
2.匿名函数
3.多继承
4.暂时想到这三个,如果有请补充在评论区
转载于:https://www.cnblogs.com/datang6777/p/7111683.html