node.js - 是否有可能做到这一点?(涉及解构和重新分配)
问题描述
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.解析数据
我很想知道是否可以在响应所在的参数(第二个参数)中做这两件事。
解决方案
不优雅。解构只是为了将现有对象的属性提取到变量中,而不是做额外的处理。可以使用hack 使用第三个参数(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 绝对是做这种事情的正确方法。
另一个可能会或可能不会发现更优雅的选项是使用 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);
});
推荐阅读
- angular - Ionic POST: response is a String instead of JSON
- tensorflow - 成功训练后的对象检测 API 未识别对象
- angular - Login not working after adding HTTP Interceptor - Angular 5
- ios - 获取存储在远程位置的 PDF 文件的缩略图 iOS 9 | 迅速
- swagger - Swagger Codegen 为 OpenAPI 3.0 生成什么文件夹结构?
- ios - 不明白如何本地化 iOS react-native 应用的 plist
- javascript - 如何将类绑定到需要在 Vue.js (v1) 中更改的方法
- javascript - Office.js recognizing ContentControl positions in the document
- redux - Flutter 类型的中间件
- ios - 将 GMSAutocompleteViewController 设置为仅特定于状态