关于服务请求,服务端部署等相关相关问题记录
axios 相关
- 请求头相关
axios 使用 post 发送数据时,默认是直接把 json 放到请求体中提交到后端的。
也就是说,我们的Content-Type
变成了application/json;charset=utf-8
(注意结尾不要带分号;),这是 axios 默认的请求头 content-type 类型。
post 请求常见的数据格式、请求头(content-type)Content-Type: application/json
: 请求体中的数据会以 json 字符串的形式发送到后端 如: {a:123}Content-Type: application/x-www-form-urlencoded
:请求体中的数据会以普通表单形式(键值对,k=v 写法)发送到后端 body 中:a=100Content-Type: multipart/form-data
: 它会将请求体的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。
客户端解决 Content-Type: multipart/form-data
的数据类型传参 ?
// 方式 formData
/* FormData对象的使用:
用一些键值对来模拟一系列表单控件:即把form中所有的元素的name与value组成一个queryString。
异步上传二进制文件。
对于这种类型的数据,我们常见前端页面上传个人图像,然后点击保存发送后端修改原始数据 如下:
*/
let params = new FormData();
// const name = params.get("userName") // 还可以获取
params.append("file", this.file);
params.append("id", localStorage.getItem("userID"));
params.append("userName", this.name);
params.append("sex", this.sex);
params.append("email", this.email);
params.append("qq", this.qq);
axios
.post(URL, params, { headers: { "Content-Type": "multipart/form-data" } })
.then((res) => {
if (res.data.code === 0) {
this.$router.go(-1);
}
})
.catch((error) => {
alert("更新用户数据失败" + error);
});
客户端解决 application/x-www-form-urlencoded
形式的传参?
// 方式1: URLSearchParams
// 需要注意的是: URLSearchParams 不支持所有的浏览器,但是总体的支持情况还是 OK 的,所以优先推荐这种简单直接的解决方案
let param = new URLSearchParams();
param.append("username", "admin");
param.append("pwd", "admin");
axios({
method: "post",
url: "/api/lockServer/search",
data: param,
});
// 方式2:qs 转换数据为key=value格式
// 引入 qs ,这个库是 axios 里面包含的,不需要再下载。
import Qs from "qs";
let data = {
username: "cc",
psd: "123456",
};
axios({
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
method: "post",
url: "/api/lockServer/search",
data: Qs.stringify(data),
});
部署服务器后遇到的问题记录
- 客户端代码部署服务器后代理访问接口未授权?
客户端代码请求了第三方服务接口,接口请求头添加了自定义请求头类似__s__
__token__
_token_
,浏览器里可以看到这些请求头,但是接口是服务端 nginx 代理,nginx 默认会过滤掉请求头包含_ 、 -
的字段,导致这些参数消失请求失败。
node 服务部署服务器遇到问题
- 添加 5000 端口外网访问不到?
宝塔面板启动后,默认 linux 服务器防火墙开启了,需手动关闭防火墙
my 服务器配置
1vCPUs | 2GB
CentOS 8.2 64bit
命令:
查看防火状态systemctl status firewalld
暂时关闭防火墙systemctl stop firewalld
永久关闭防火墙systemctl disable firewalld
重启防火墙systemctl enable firewalld
查看 5000 端口是否被监听ss -nutlp | grep 5000
curl 使用
查看某地址是否可访问
- node 服务启动文件监听 ip?
node 服务启动文件 监听 ip 一定要写成0.0.0.0
或者可以省略不写;由于我写成了127.0.0.0
导致部署服务器后访问失败! - 一般外网无法访问服务器指定端口排查如下
排查服务商对应端口安全组是否开放?
排查服务器对应端口是否放行
排查服务器防火墙是否关闭 - 服务器使用 pm2
服务器使用 pm2 启动 node 服务失败
在云服务器上使用 pm2 管理 node 服务器进程,启动时失败。mysql 连接 host 为 localhost 时可以,换成服务器公网 ip 就不行了。排查后发现是因为服务器数据库权限没添加对应 ip!! - mysql 数据库自动关闭
解决nodejs的Connection lost: The server closed the connection
原因:mysql 自带一段时间无动作会自动关闭的机制
node 服务部署服务器后默认 8 小时不操作数据库会自动关闭,解决方法:使用连接池