【问题标题】:Is it possible to do this? (Involves destructuring and reassignment)是否有可能做到这一点? (涉及解构和重新分配)
【发布时间】:2020-06-18 03:15:10
【问题描述】:
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);
});

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

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

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

-JSON.解析数据

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

【问题讨论】:

    标签: node.js api request response destructuring


    【解决方案1】:

    不优雅。解构只是为了将现有对象的属性提取到变量中,而不是做额外的处理。 可能,使用 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。有了它,您可以改为在 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);
        });
    

    【讨论】:

    • 似乎我优化代码的尝试实际上使代码复杂化,而不是帮助。绝对是一些好的建议,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2011-01-31
    • 1970-01-01
    • 2012-09-30
    相关资源
    最近更新 更多