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

Is it possible to do this? (Involves destructuring and reassignment)

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.parse数据

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

不优雅。解构只是为了将已有对象的属性提取到变量中,而不是做额外的处理。 可能,使用 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 绝对是 正确的 方法来做这种事情。

您可能会或可能不会发现更优雅的另一个选项是使用节点获取。有了它,您可以改为在 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);
    });