node.js - 在 NodeJS 中检查外部 URL 的协议
问题描述
有没有办法使用 NodeJS 检查外部站点的协议是什么。
例如,为了缩短 URL 的目的,人们可以提供一个 url,如果他们省略了 http 或 https,我会检查它应该是哪个并添加它。
我知道我可以在没有协议的情况下重定向用户,但我只是好奇是否有办法检查它。
解决方案
当然可以。首先安装request-promise
及其依赖项request
:
npm install request request-promise
现在我们可以编写一个异步函数来获取可能缺少其协议的 URL,并在必要时添加它:
const rq = require('request-promise');
async function completeProtocol(url) {
if (url.match(/^https?:/)) {
// fine the way it is
return url;
}
// https is preferred
try {
await rq(`https://${url}`, { method: 'HEAD' });
// We got it, that's all we need to know
return `https://${url}`;
} catch (e) {
return `http://${url}`;
}
}
请记住,发出这样的请求可能会占用您服务器上的资源,尤其是当有人发送大量此类请求时。您可以通过timeout: 2000
在调用时作为选项传递来缓解这种情况rq
。
还可以考虑只请求站点的主页,解析 URL 的其余部分,以降低以某种方式被滥用的风险。整个站点的协议应该相同。