客户端服务器错误代码小总结
1、node.js 连接mysql数据库时:
1)'Client does not support authentication protocol requested by server; consider upgrading MySQL client' cnpm
下载的应用mysql模块版本与本机安装的mysql版本不同
即 主要原因时mysql服务器要求的认证插件版本与客户端不一致造成的。 用户使用的plugin是caching_sha2_password(新版认证加密格式)。
解决:将root的plugin改为mysql_native_password,相当于降一级。(plugin的作用之一就是处理后的密码格式和长度是不一样的,类似于使用MD5加密和使用base64加密一样对于同一个密码处理后的格式是不一样的)
1、alter user 'root'@'localhost' identified with mysql_native_password by 'root'(root:你想设置为的密码);(重新设置密码,并用mysql_native_password重新编码)
(alter user 'root'@'localhost' identified with mysql_native_password by '123456';)正确
2、flush privileges(刷新)
2、前端请求服务时:控制台报错:
1)500 (Internal Server Error) 是服务器出错
regist.html:1 Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0 原因之一是send()出去即返回给前端的内容不是对象。
解决: res.send(obj) 例如:res.send(‘ok’) => res.send(’{“msg”:“ok”}’)。
2)Unhandled Rejection (SyntaxError): Unexpected token < in JSON at position 0
当你发送一个HTTP请求,可能是用Fetch或者其他的Ajax库,可能会出现这个错误提示,或者相似的错误。
这些错误发生在当你向服务器发送请求,返回值不是JSON而用JSON的方法解析的时候。(没有导入所需的模块也会导致)
JSON.parse(`不是Json的字符串`);
JSON.parse()本质上是和res.json()一样的,所以它们发生错误的情况是相同的。
无效的JSON:
JSON应该以有效的JSON值开始 —— 一个object, array, string, number, 或者是
false/true/null。以<开始的返回值会有Unexpected token <这样的提示。
<这个符号意味着返回值是HTML而不是JSON。
引起这个错误的根源是服务端返回的是HTML或者其他不是Json的字符串。
解决:首先要做是先把返回值打印出来。如果用fetch,可以用res.text()代替res.json()来获得字符串。把你的代码转换成如下这样,并且通过打印出来的内容查看哪里出问题了
注意像res.json()和res.text()这样的方法是异步的。所以不能直接把它们的返回值打印出来,这就是console.log必须在.then的括号里面的原因。
服务器有好几种原因返回HTML而不是JSON:
请求的url不存在,服务器以HTML的方式返回404页面。
你可能在请求时代码写错(像把/user写成了/users),或者服务端的代码的错误。
当添加了新的路由时,服务器需要重启。
比如你在用Express写的服务器时,刚刚新加了一个app.get('/users', ...)路由,但是没有重启,服务器就不会对新的路由地址有反应。
客户端的代理没有设置:
如果在使用像Create React App的Webpack dev server时,你可以设置一个指向后端服务器的代理。
API的根url是/:
如果你在通过Webpack 或Create React App使用代理,要确认你的API路由不在根的层级/。这样会时代理服务器混淆,你将得到一个HTML而不是你的API请求的返回。你可以在如有前面加个前缀像/api/。
同时可以通过devtools的network查看请求的返回值。
3、ajax请求服务器时(通过页面发送请求),会出现跨域
1)
Access to XMLHttpRequest at 'http://localhost:3000/' from origin 'null' has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
同源策略:是浏览器上为安全性考虑实施的非常重要的安全策略。URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源
由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,当你试图请求不同域的资源时,浏览器会发出如下警告。
跨域资源共享(CORS ):
是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源。而这种访问是被同源策略所禁止的。
CORS系统定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求。 它是一个妥协,有更大的灵活性,但比起简单地允许所有这些的要求来说更加安全。
解决:CORS就是能实现跨域访问的一种方法。只需要服务器响应头Access-Control-Allow-Origin中含有发起请求的域,就可跨域获取资源。
在服务器中为响应设置头部: res.writeHeader(200,{ 'Access-Control-Allow-Origin':'*' });
4、 使用Ajax向服务器发送post请求时,服务器res.body的值为undefined:
1)是因为服务器缺少信息配置,要添加如下两行代码:
app.use(express.json());
app.use(express.urlencoded({extended:false}));
2)配完后收到的数据为空{};可能是因为发送请求界面没有配置投信息:
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
3)头信息添加完成后,报:Uncaught DOMException: Failed to execute ‘setRequestHeader’ on ‘XMLHttpRequest’: The object’s state must be OPENED.
原因是因为头部信息添加位置错误:应该把头部设置信息放在xhr.open(打开链接)后面。