(接上一篇)上面说到,在使用angular2调用后台接口的时候,遇到了两个问题:1、cookie里面没有cookie请求标头;2.,对于两个请求,node后端新开一个线程。关于这两个问题,其实我觉得请求头cookie的问题解决了,后面的问题自然也就解决了。cookie的作用是什么,为什么需要这个cookie,看下图的前后端请求模式。不难看出,这个cookie就是session会话中获取信息的凭证。只有将匹配的cookie发送到后台才能获取到相应的信息,否则会创建一个新的session。在这里,让我们看一下XMLHttpRequest.withCredentials属性。度娘解释如下。XMLHttpRequest.withCredentials属性是一个Boolean类型,表示是否使用cookie、授权头(headauthorization)或TLS客户端证书等限定条件。证书创建跨站点访问控制(cross-siteaccess-control)请求。在同一个站点下使用withCredentials属性是无效的。此外,此指示还将用作忽略响应中cookie的标志。默认值为假。如果在从另一个域发送XMLHttpRequest之前没有将withCredentials设置为true,则无法为其自己的域设置cookie值。通过设置withCredentials为true获得的第三方cookies仍然享受同源策略,因此无法通过header请求对应的document.cookie或脚本访问。angular2中的HTTP显然也是基于XML的请求,所以必须要有这个属性。查看http接口的请求接口说明。默认情况下,一般浏览器的CORS跨域请求,除非指定xhr.withCredentials=true,否则不会向服务端发送cookies等认证信息,但仅当客户端单方面设置这个值是不够的,服务端还需要同意,所以服务端也需要设置返回头Access-Control-Allow-Credentials:true;还有一点要注意,返回头Access-Control-Allow-Origin的值不能是星号,必须是指定的域,否则无法发送cookie等认证信息。接口详细信息url:stringmethod:string|RequestMethodsearch:string|URLSearchParams|{[key:string]:any|任何[]}参数:字符串|URLSearchParams|{[键:字符串]:任何|any[]}headers:Headersbody:anywithCredentials:booleanresponseType:ResponseContentType问题找到了,就是这个!然后修改请求代码,查看请求头信息。很明显,请求头中已经添加了cookie,并且cookie都匹配上了。好像没什么问题。但是看请求接口的响应。没有信息,但是后台明明有返回信息,而且这个响应每次都不会返回任何信息,有机会。此时,显然还有一个问题,就是跨域。查看浏览器的控制台信息可知XMLHttpRequest无法加载http://neil.com:8090/api/send。当请求的凭据模式为“include”时,响应中“Access-Control-Allow-Origin”标头的值不得为通配符“*”。因此不允许访问源“http://localhost:4200”。由XMLHttpRequest发起的请求的凭据模式由withCredentials属性控制。至此,问题就清楚了。只要解决了跨域问题,整个过程就会很顺利。网上也有很多处理跨域的方法,但是如果不想用jsonp,就只能从服务端下刀了。查了一些资料,最流行的无非就是在服务端添加请求头设置//设置跨域访问app.all('*',function(req,res,next){res.header("Access-Control-Allow-Origin","http://neil.com:4200");//设置跨域访问res.header('Access-Control-Allow-Credentials','true');res.header('Access-Control-Allow-Methods','GET,POST,PUT,DELETE,OPTIONS');res.header('Access-Control-Allow-Headers','Origin,No-Cache,X-Requested-With,If-Modified-Since,Pragma,Last-Modified,Cache-Control,Expires,Content-Type,X-E4M-With');res.header("Content-Type","application/x-www-form-urlencoded“);下一个();});这里说明,'Access-Control-Allow-Origin'必须设置请求方的域名,否则无法跨域,问题无法解决。现在,问题都解决了。