提取请求返回状态信息和可读流

时间:2018-10-19 17:26:39

标签: javascript http fetch

我正在向后端进行访存呼叫,这是呼叫。

    const response = await fetch(apiUrl + '/recipes', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Token token=${user.token}`
      },
      body: JSON.stringify({
        recipe: {
          recipeId: uri
        }
      })
    })

这就是我在后端将呼叫发送到的路由

router.post('/recipes', requireToken, (req, res) => {
  req.body.recipe.owner = req.user.id
  Recipe.create(req.body.recipe)
    .then(recipe => {
      console.log('Recipe object saved is', recipe)
      res.status(201).json({ recipe: recipe.toObject() })
    })
    .catch(err => handle(err, res))
})

执行此操作时,正确的对象将在发送回之前记录。这是一个记录的示例

{ __v: 0,
  updatedAt: 2018-10-19T15:47:16.809Z,
  createdAt: 2018-10-19T15:47:16.809Z,
  recipeId: 'http://www.edamam.com/ontologies/edamam.owl#recipe_7dae4a3b1f6e5670be3c2df5562e4782',
  owner: 5bc9fc6a3682194cdb8d6fa5,
  _id: 5bc9fc843682194cdb8d6fa7 }

但是,当我在console.log上获得前端的内容时,我得到了。

Response {type: "cors", url: "http://localhost:4741/recipes", redirected: false, status: 201, ok: true, …}
body: ReadableStream
bodyUsed: true
headers: Headers {}
ok: true
redirected: false
status: 201
statusText: "Created"
type: "cors"
url: "http://localhost:4741/recipes"
__proto__: Response

在通话中,它确实在我的数据库中记录了操作,因此该信息被保存,并在应将其发送回去之前被记录下来,但是正确的信息没有被发送回去。 谢谢您的任何答复。

1 个答案:

答案 0 :(得分:2)

由于您使用fetch发出请求,因此响应被封装在Response对象中,要访问它,您必须调用异步方法json()。如下所示:

const Response = await fetch(apiUrl + '/recipes', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Token token=${user.token}`
  },
  body: JSON.stringify({
    recipe: {
      recipeId: uri
    }
  })
});

const json = await Response.json();
console.log(json);

您可以在chrome控制台中玩另一个示例。

(async () => {  
  const Response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
  const res = await Response.json();
  console.log(res);
})();

更新

另一种方法是:

(async () => { 
  const response = await (
    await fetch('https://jsonplaceholder.typicode.com/todos/1')
  ).json();

  console.log(response);
})();

我希望这会有所帮助。