是否有可能做到这一点? (涉及解构和重新分配)

时间:2019-12-04 02:15:40

标签: node.js api request response destructuring

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);
});

此代码段来自Andrew Mead的完整NodeJS Developer课程。我当时在弄乱代码(我没有提供秘密的API密钥),但是我很好奇,试图在一条语句中完成两行代码……特别是我想:

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

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

-JSON.parse数据

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

1 个答案:

答案 0 :(得分:0)

不优雅。解构仅旨在将现有对象的属性提取到变量中,而不是进行其他处理。通过黑客,使用第三个参数(request未提供),可以可能使用,默认为JSON.parse d 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绝对是执行此类操作的 right 方法。

您可能会或可能不会觉得更优雅的另一种选择是使用节点获取。使用它,您可以改为在Response对象上调用.json(),指示应将其解析为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);
    });