首页 > 解决方案 > 是否有可能做到这一点?(涉及解构和重新分配)

问题描述

const request = require('request');

const url = 'https://api.darksky.net/{secret_key}/37.8267,-122.4233';

request({ url }, (error, { body: data }) => {
  data = JSON.parse(data);
  console.log(data.currently);
});

此代码片段来自 NodeJS 的在线课程。我在搞乱代码(我没有提供秘密的 API 密钥),但我很想尝试在一个语句中完成两行代码,特别是我想:

request({ url }, (error, { body: data }) => {
  data = JSON.parse(data);

- 解构响应(我使用 {body: data} 完成)

-JSON.解析数据

我很想知道是否可以在响应所在的参数(第二个参数)中做这两件事。

标签: node.jsapirequestresponsedestructuring

解决方案


不优雅。解构只是为了将现有对象的属性提取到变量中,而不是做额外的处理。可以使用hack 使用第三个参数(request不提供),默认为JSON.parsed data

const url = 'https://jsonplaceholder.typicode.com/todos/1';
request({ url }, (error, { body: data }, parsedData = JSON.parse(data)) => {
  console.log(parsedData);
});

但这很令人困惑,不应该这样做。

另一个类似的方法,没有第三个参数,但使用响应对象的一个​​不存在的属性:

request({ url }, (error, { body: data, parsedData = JSON.parse(data) }) => {
  console.log(parsedData);
});

但这些只是愚蠢的把戏。在回调的第一行解析 JSON 绝对是做这种事情的正确方法。

另一个可能会或可能不会发现更优雅的选项是使用 node-fetch。有了它,您可以调用.json()Response 对象,指示它应该被解析为 JSON 而不是文本(对于纯文本,您将使用.text()):

const fetch = require('node-fetch');
const url = 'https://jsonplaceholder.typicode.com/todos/1';
fetch(url)
    .then(res => res.json())
    .then((obj) => {
        console.log(obj);
    });

推荐阅读