gpt4 book ai didi

javascript - 如何从 Nodejs 的 HTTPS GET 请求返回响应?

转载 作者:行者123 更新时间:2023-12-02 16:15:27 26 4
gpt4 key购买 nike

我还在学习 node.js,所以请多关照。

我在没有打开书本的情况下努力了解一些基础知识。

我编写了一个函数来从 URL 中获取一些 JSON。这行得通,但是我如何从函数返回数据,然后取出位。这是我的代码。 SerialNumber 是返回的 JSON 元素之一。

const https = require('https');

function authenticate( uuid , cdcloc ) {
let url = cdcloc + "/api.php?uuid=" + uuid + '&auth';
https.get(url,(res) => {
let body = "";
res.on("data", (chunk) => {
body += chunk;
});
res.on("end", () => {
try {
let cdcResponse = JSON.parse(body);
// do something with JSON
return cdcResponse[0];
} catch (error) {
console.error(error.message);
};
});
}).on("error", (error) => {
console.error(error.message);
});
}
const connection = authenticate( 'DATATOBEPASSED' , 'https://URLHERE');
console.log(connection.SerialNumber);

最佳答案

Node 式回调

O.Jones 的回答是正确的,但它违背了 Node 的 error-first callbacks 惯例.我认为每次需要发出请求时都访问 https.get 也是错误的。这是一个低级函数,因为它要求您连接如此多的点点滴滴,您很可能会犯一些容易避免的错误。

我们可以编写一个通用的 getString 函数来包装 https.get -

const https = require('https')

function getString(url, options, callback)
{ https
.get(url, options, res => {
let s = "";
res.on("data", d => s += d)
res.on("end", _ => callback(null, s) // error-first callback
})
.on("error", e => callback(e)) // error-first callback
}

既然我们有了一个获取字符串的通用函数,我们就不需要编写 res.on("data, ...)res.on("end ", ...) 在发出请求的每个函数中。但不要停在这里。您通常会想要 JSON.parse 结果 -

function getJSON(url, options, callback)
{ getString(url, options, function(err, data)
{ if (err) callback(err) // getString error
else try { callback(null, JSON.parse(data) } // JSON.parse success
catch (e) { callback(e) } // JSON.parse error
}
}

现在我们可以编写 authenticate 而无需接触裸露的 https.get 或每次都担心解析 JSON -

function authenticate(uuid, cdcloc, callback)             // callback
{ const url = cdcloc + "/api.php?uuid=" + uuid + '&auth'
getJSON(url, {}, function(err, json)
{ if (err)
callback(err) // getJSON error
else if (json.length == 0)
callback(Error("empty response")) // empty response error
else
callback(null, json[0]) // success
}
}

promise

但是所有这些仍然很痛苦,不是吗?输入 promise 。 Node 式回调是在我们无法访问异步控制流原语的时候设计的。从那时起我们已经走了很长一段路。要了解 promises 是如何工作的,我们将重新实现上面的功能,但这次不需要到处传递回调和错误检查 -

const https = require('https')

function getString(url, options) // no callback
{ return new Promise((resolve, reject) => // return Promise
{ https
.get(url, options, res => {
let s = "";
res.on("data", d => s += d)
res.on("end", _ => resolve(s)) // success, resolve
})
.on("error", e => reject(e)) // failure, reject
}
}

当我们重写 getJSON -

时,我们会立即看到新实现的好处
function getJSON(url, options = {})   // no callback
{ return getString(url, options) // return promise
.then(s => JSON.parse(s)) // errors auto bubble up
}

当我们编写 authenticate 时还有更多好处 -

function authenticate(uuid, cdcloc)                   // no callback
{ const url = `${cdcloc}/api.php?uuid=${uuid}&auth`
return getJSON(url) // return promise
.then(data => {
if (data.length == 0)
throw Error("empty response") // local error
else
return data[0] // success
}) // no error-check
}

异步/等待

甚至 Promises 也已经存在了很长时间,自从它们原生包含在 ECMAScript 中以来我们学到了很多东西。记住要返回 promises 并且必须通过 .then 调用对所有数据进行排序是乏味的,就像编写那些初始 res.on("data", ...)res.on("end", ...) 处理程序感觉。 asyncawait 关键字允许我们使用异步控制流,而不必牺牲同步编程风格 -

async function getJSON(url, options = {})   // async
{ const s = await getString(url, options) // await
return JSON.parse(s) // auto wrapped in Promise
}

编写 authenticate 很简单,感觉很自然 -

async function authenticate(uuid, cdcloc)                 // async 
{ const url = `${cdcloc}/api.php?uuid=${uuid}&auth`
const data = await getJSON(url) // await
if (data.length == 0)
throw Error("empty response") // throw if empty
else
return data[0] // return first
}

使用起来很简单,感觉也很自然 -

async function connect()
{ const connection = await authenticate( 'DATATOBEPASSED' , 'https://URLHERE')
console.log(connection.SerialNumber)
// ...
return "done" // or whatever
}

connect().then(console.log, console.error) // errors bubble all the way up

网址

我还应该提到,使用字符串连接构建 URL 非常乏味,而且容易出现大量错误。你应该培养对这种痛苦的感觉,并知道这意味着有缓解的余地。看看 URL module可以以几乎所有可以想象的方式安全地构建/操作 URL。

关于javascript - 如何从 Nodejs 的 HTTPS GET 请求返回响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66871595/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com