这种写法并不能解决问题1
Access-Control-Allow-Origin: https://www.google.com,https://www.baidu.com
应该写成下面这种
1 | app.all('*', function(req, res, next) { |
如果想不限制域名
1 | app.all('*', function(req, res, next) { |
这种写法并不能解决问题1
Access-Control-Allow-Origin: https://www.google.com,https://www.baidu.com
应该写成下面这种
1 | app.all('*', function(req, res, next) { |
如果想不限制域名
1 | app.all('*', function(req, res, next) { |
JavaScript 通过 XMLHttpRequest(XHR) 来执行异步请求,这个方式已经存在了很长一段时间。但它不是最佳API。它在设计上不符合职责分离原则,将输入、输出和用事件来跟踪的状态混杂在一个对象里。而且,基于事件的模型与最近 JavaScript 流行的 Promise 以及基于生成器的异步编程模型不太搭。新的 Fetch API 打算修正上面提到的那些缺陷。
而与jQuery相比, fetch 方法与 jQuery.ajax() 的主要区别在于:
fetch() 方法返回的 Promise 对象并不会在HTTP状态码为404或者500的时候自动抛出异常,而需要用户进行手动处理fetch 并不会发送任何的本地的 cookie 到服务端,注意,如果服务端依靠 Session 进行用户控制的话要默认开启 Cookiewindow.fetch 是基于 XMLHttpRequest 的浏览器的统一的封装,针对老的浏览器可以使用 Github 的这个polypill。 fetch 基于 ES6 的 Promise ,在旧的浏览器中首先需要引入 Promise的 polypill ,可以用 es6-promise:1
npm install es6-promise
使用 isomorphic-fetch:1
npm install --save isomorphic-fetch es6-promise
使用的时候也非常方便:
1 | require('es6-promise').polyfill(); |
1 | fetch('/users.html') |
1 | fetch('/users.json') |
1 | fetch('/users.json').then(function(response) { |
1 | var form = document.querySelector('form') |
1 | fetch('/users', { |
1 | var input = document.querySelector('input[type="file"]') |
Request对象代表了一次fetch请求中的请求体部分,你可以自定义Request对象:
method - 使用的HTTP动词,GET, POST, PUT, DELETE, HEADurl - 请求地址,URL of the requestheaders - 关联的Header对象referrer - referrermode - 请求的模式,主要用于跨域设置,cors, no-cors, same-origincredentials - 是否发送Cookie omit, same-originredirect - 收到重定向请求之后的操作,follow, error, manualintegrity - 完整性校验cache - 缓存模式(default, reload, no-cache)1 | var request = new Request('/users.json', { |
1 | fetch('/users.json', { |
如果需要设置fetch自动地发送本地的Cookie,需要将credentials设置为same-origin:1
2
3fetch('/users', {
credentials: 'same-origin'
})
该选项会以类似于XMLHttpRequest的方式来处理Cookie,否则,可能因为没有发送Cookie而导致基于Session的认证出错。可以将credentials的值设置为include来在CORS情况下发送请求。1
2
3fetch('https://example.com:1234/users', {
credentials: 'include'
})
1 | // Create an empty Headers instance |
最简单的方法是服务端将响就头设置成 Access-Control-Allow-Origin:域名,如果客户端发送请求时,不需要携带 cookie 等信息,可以设置成 Access-Control-Allow-Origin:* ,表示任何域都可以向服务端发送请求,客户端不需要任何配置,就可以进行跨域调试了。
但一般网站,都需要向后端发送 cookie来进行身份验证,此时,服务器还需向响应头设置 Access-Control-Allow-Credentials:true,表示跨域时,允许cookie添加到请求中。设置 Access-Control-Allow-Credentials:true 后,要将 Access-Control-Allow-Origin 指定到具体的域,否则cookie不会带到客户端,例如设置成Access-Control-Allow-Origin:http://192.168.0.1:8088,http://192.168.0.1:8088 是前端服务器的域名,这就要求用webpack的时候,要指定具体的域来启动,不要直接用localhost。1
2
3
4
5...
devServer: {
host: '192.168.0.1:8088',
},
...
要向后端发送cookie,前端也需要有相应的配置。需要将credentials设置成include,表示允许跨越传递cookie,不要将credentials设置成same-origin,如果设置成same-origin,只会在同源的时候发送cookie。另外还要将 withCredentials 设为true。
在fetch的then函数中提供了一个Response对象,即代表着对于服务端返回值的封装,你也可以在Mock的时候自定义Response对象,譬如在你需要使用Service Workers的情况下,在Response中,你可以作如下配置:
type - basic, corsurluseFinalURL - 是否为最终地址status - 状态码 (ex: 200, 404, etc.)ok - 是否成功响应 (status in the range 200-299)statusText - status code (ex: OK)headers - 响应头The Response also provides the following methods:
clone()- Creates a clone of a Response object.error() - Returns a new Response object associated with a network error.redirect() - Creates a new response with a different URL.arrayBuffer() - Returns a promise that resolves with an ArrayBuffer.blob() - Returns a promise that resolves with a Blob.formData() - Returns a promise that resolves with a FormData object.json() - Returns a promise that resolves with a JSON object.text() - Returns a promise that resolves with a USVString (text).1 | function checkStatus(response) { |
1 | fetch('https://davidwalsh.name/demo/arsenal.json').then(function(response) { |
1 | fetch('/next/page') |
如果你希望通过fetch方法来载入一些类似于图片等资源:
1 | fetch('flowers.jpg') |
Nothing to say
Front-End Development Engineer