没有从同构获取中取回数据 (React/Phoenix)
Not getting data back from isomorphic-fetch (React/Phoenix)
我在 localhost:3000
上有一个 create-react-app
,在 :4000
上有一个 phoenix 1.3 服务器。我正在尝试在两者之间设置 JWT 身份验证。
当我 curl
我的服务器工作正常。
$ curl -H "Content-Type: application/json" -X POST -d '{"session":{"email":"me@example.com", "password":"password"}}' http://localhost:4000/api/v1/sessions
>>> {"user":{"id":1,"handle":"me","email":"me@example.com"},"jwt":"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJVc2VyOjEiLCJleHAiOjE1MDYxNzQ2MzcsImlhdCI6MTUwMzU4MjYzNywiaXNzIjoiQXRoZW5hIiwianRpIjoiY2I5YjgyMDMtZjMxMi00YTE2LWIwOTItZjg4NDVlNmUzYzhiIiwicGVtIjp7fSwic3ViIjoiVXNlcjoxIiwidHlwIjoidG9rZW4ifQ.mg36_4Nj2tf26ey7c72rHnZKhQBlQZeBt1CSnsua44YYndt3i9ltPA1oq_WTp58f0f6X2KqioPlrdns2O5drgQ"}
React 端看起来像这样:
import React from 'react';
import fetch from 'isomorphic-fetch';
import { polyfill } from 'es6-promise';
const defaultHeaders = {
Accept: 'application/json',
'Content-Type': 'application/json',
};
function headers() {
return { ...defaultHeaders };
}
...
fetch("http://localhost:4000/api/v1/sessions", {
method: 'post',
headers: headers(),
body: JSON.stringify({session: {email: "me@example.com", password:"password"}}),
}).then(function(response){
console.log(response);
alert("Pausing so browser does not refresh");
})
当我进行 fetch
调用时,服务器控制台输出好像 curl
请求成功进入。但是,我放入 fetch 的第一个 .then()
子句中的任何函数似乎都没有发生任何事情。我没有看到警报或 console.log(response)
.
最初我认为这是一个 CORS 问题,但我在 phoenix 中安装了 cors_plug 并在服务器上看到了所需的行为。我还在 Chrome.
上安装了 Allow-Control-Allow-Origin plugin
关于同构获取我是否遗漏了什么? (或者,是否有更多 'React' 方法来做到这一点?)
题中代码添加的Content-Type: application/json
header触发浏览器做了一个CORS preflight OPTIONS
request。因此,要在 curl
中模拟,您需要执行以下操作:
curl -X OPTIONS -i -H 'Origin: http://localhost:3000' \
-H 'Access-Control-Request-Method: POST' \
-H 'Access-Control-Request-Headers: Content-Type' \
http://localhost:4000/api/v1/sessions
上面的评论表明服务器用 204 响应,这表明服务器至少配置为处理 OPTIONS
请求,所以这部分没问题。但有什么不对:同样的评论表明服务器发送回浏览器的一个响应是 400(“错误请求”),这意味着服务器从浏览器收到的请求不是服务器所期望的。
因此您可以在浏览器开发工具中打开网络窗格,重新加载并检查浏览器发送的 POST
请求的详细信息——确保它确实发送了 Content-Type: application/json
请求 header并且请求的 body 看起来像您使用 curl
.
发送的内容
我在 localhost:3000
上有一个 create-react-app
,在 :4000
上有一个 phoenix 1.3 服务器。我正在尝试在两者之间设置 JWT 身份验证。
当我 curl
我的服务器工作正常。
$ curl -H "Content-Type: application/json" -X POST -d '{"session":{"email":"me@example.com", "password":"password"}}' http://localhost:4000/api/v1/sessions
>>> {"user":{"id":1,"handle":"me","email":"me@example.com"},"jwt":"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJVc2VyOjEiLCJleHAiOjE1MDYxNzQ2MzcsImlhdCI6MTUwMzU4MjYzNywiaXNzIjoiQXRoZW5hIiwianRpIjoiY2I5YjgyMDMtZjMxMi00YTE2LWIwOTItZjg4NDVlNmUzYzhiIiwicGVtIjp7fSwic3ViIjoiVXNlcjoxIiwidHlwIjoidG9rZW4ifQ.mg36_4Nj2tf26ey7c72rHnZKhQBlQZeBt1CSnsua44YYndt3i9ltPA1oq_WTp58f0f6X2KqioPlrdns2O5drgQ"}
React 端看起来像这样:
import React from 'react';
import fetch from 'isomorphic-fetch';
import { polyfill } from 'es6-promise';
const defaultHeaders = {
Accept: 'application/json',
'Content-Type': 'application/json',
};
function headers() {
return { ...defaultHeaders };
}
...
fetch("http://localhost:4000/api/v1/sessions", {
method: 'post',
headers: headers(),
body: JSON.stringify({session: {email: "me@example.com", password:"password"}}),
}).then(function(response){
console.log(response);
alert("Pausing so browser does not refresh");
})
当我进行 fetch
调用时,服务器控制台输出好像 curl
请求成功进入。但是,我放入 fetch 的第一个 .then()
子句中的任何函数似乎都没有发生任何事情。我没有看到警报或 console.log(response)
.
最初我认为这是一个 CORS 问题,但我在 phoenix 中安装了 cors_plug 并在服务器上看到了所需的行为。我还在 Chrome.
上安装了 Allow-Control-Allow-Origin plugin关于同构获取我是否遗漏了什么? (或者,是否有更多 'React' 方法来做到这一点?)
题中代码添加的Content-Type: application/json
header触发浏览器做了一个CORS preflight OPTIONS
request。因此,要在 curl
中模拟,您需要执行以下操作:
curl -X OPTIONS -i -H 'Origin: http://localhost:3000' \
-H 'Access-Control-Request-Method: POST' \
-H 'Access-Control-Request-Headers: Content-Type' \
http://localhost:4000/api/v1/sessions
上面的评论表明服务器用 204 响应,这表明服务器至少配置为处理 OPTIONS
请求,所以这部分没问题。但有什么不对:同样的评论表明服务器发送回浏览器的一个响应是 400(“错误请求”),这意味着服务器从浏览器收到的请求不是服务器所期望的。
因此您可以在浏览器开发工具中打开网络窗格,重新加载并检查浏览器发送的 POST
请求的详细信息——确保它确实发送了 Content-Type: application/json
请求 header并且请求的 body 看起来像您使用 curl
.