node.js检查是否存在远程URL

met*_*ate 15 javascript node.js

如何在不拉下URL的情况下检查URL是否存在?我使用以下代码,但它下载整个文件.我只需要检查它是否存在.

app.get('/api/v1/urlCheck/', function (req,res) {
    var url=req.query['url'];
    var request = require('request');
    request.get(url, {timeout: 30000, json:false}, function (error, result) {
        res.send(result.body);

    });

});
Run Code Online (Sandbox Code Playgroud)

感谢任何帮助!

小智 30

试试这个:

var http = require('http'),
    options = {method: 'HEAD', host: 'stackoverflow.com', port: 80, path: '/'},
    req = http.request(options, function(r) {
        console.log(JSON.stringify(r.headers));
    });
req.end();
Run Code Online (Sandbox Code Playgroud)

  • @schlicki,您将 npm request 模块与 Node.JS 内部内置 http 模块的 request 函数混淆了 (9认同)
  • opts!= options;) (3认同)
  • 截至 2020 年 1 月,请求包仅处于维护阶段,不应再使用 (https://nodesource.com/blog/express-going-into-maintenance-mode)。最好寻找替代方案。url-exists 基于请求,因此现在也已弃用。 (2认同)

Ric*_*all 17

2021 更新

使用url-exist

import urlExist from "url-exist"

const exists = await urlExist("https://google.com")

// Handle result
console.log(exists)
Run Code Online (Sandbox Code Playgroud)

2020年更新

request现在已被弃用,这导致了url-exists它的失败。使用url-exist来代替。

const urlExist = require("url-exist");

(async () => {
    const exists = await urlExist("https://google.com");
    // Handle result
    console.log(exists)
})();
Run Code Online (Sandbox Code Playgroud)

如果您(出于某种原因)需要同步使用它,则可以使用url-exist-sync.

2019年更新

自 2017 年以来,request回调式函数 (from url-exists) 已不再使用。

但是,有一个修复方法。交换url-existsurl-exist

所以不要使用:

const urlExists = require("url-exists")

urlExists("https://google.com", (_, exists) => {
    // Handle result
    console.log(exists)
})
Run Code Online (Sandbox Code Playgroud)

用这个:

const urlExist = require("url-exist");
 
(async () => {
    const exists = await urlExist("https://google.com");
    // Handle result
    console.log(exists)
})();
Run Code Online (Sandbox Code Playgroud)

原始答案 (2017)

如果您有权访问该request软件包,则可以尝试以下操作:

const request = require("request")
const urlExists = url => new Promise((resolve, reject) => request.head(url).on("response", res => resolve(res.statusCode.toString()[0] === "2")))
urlExists("https://google.com").then(exists => console.log(exists)) // true
Run Code Online (Sandbox Code Playgroud)

大部分逻辑已经由url-exists.


Nic*_*ico 13

谢谢!这里它被封装在一个功能(更新在17年5月30日与需要外):

    var http = require('http'),
         url = require('url');

    exports.checkUrlExists = function (Url, callback) {
        var options = {
            method: 'HEAD',
            host: url.parse(Url).host,
            port: 80,
            path: url.parse(Url).pathname
        };
        var req = http.request(options, function (r) {
            callback( r.statusCode== 200);});
        req.end();
    }
Run Code Online (Sandbox Code Playgroud)

它非常快(我大约50毫秒,但它将取决于您的连接和服务器速度).请注意,它也非常基本,即它不能很好地处理重定向...

  • 现有资源或 URL 可以返回不同于 200 的状态并且仍然有效 (2认同)

Chr*_*vik 9

似乎很多人都推荐使用一个库,但url-exist包含数据获取库的依赖项,因此这里是使用所有本机节点模块的它的克隆:

const http = require('http');
const { parse, URL } = require('url');

// https://github.com/sindresorhus/is-url-superb/blob/main/index.js
function isUrl(str) {
  if (typeof str !== 'string') {
    return false;
  }

  const trimmedStr = str.trim();
  if (trimmedStr.includes(' ')) {
    return false;
  }

  try {
    new URL(str); // eslint-disable-line no-new
    return true;
  } catch {
    return false;
  }
}

// https://github.com/Richienb/url-exist/blob/master/index.js
function urlExists(url) {
  return new Promise((resolve) => {
    if (!isUrl(url)) {
      resolve(false);
    }

    const options = {
      method: 'HEAD',
      host: parse(url).host,
      path: parse(url).pathname,
      port: 80,
    };

    const req = http.request(options, (res) => {
      resolve(res.statusCode < 400 || res.statusCode >= 500);
    });
    
    req.end();
  });
}

urlExists(
  'https://stackoverflow.com/questions/26007187/node-js-check-if-a-remote-url-exists'
).then(console.log);
Run Code Online (Sandbox Code Playgroud)

这也可能会吸引那些不想为了非常简单的目的而安装依赖项的人。


Rak*_*oni 7

只需使用url-exists npm包来测试url是否存在

var urlExists = require('url-exists');

urlExists('https://www.google.com', function(err, exists) {
  console.log(exists); // true 
});

urlExists('https://www.fakeurl.notreal', function(err, exists) {
  console.log(exists); // false 
});
Run Code Online (Sandbox Code Playgroud)


小智 6

require在 Node.js 中进入函数是错误的。遵循的 ES6 方法支持所有正确的 http 状态,当然,如果您有像 fff.kkk 这样的坏“主机”,则检索错误

checkUrlExists(host,cb) {
    http.request({method:'HEAD',host,port:80,path: '/'}, (r) => {
        cb(null, r.statusCode >= 200 && r.statusCode < 400 );
    }).on('error', cb).end();
}
Run Code Online (Sandbox Code Playgroud)


Dee*_*ers 5

看看url-exists npm 包https://www.npmjs.com/package/url-exists

配置:

$ npm install url-exists
Run Code Online (Sandbox Code Playgroud)

用途:

const urlExists = require('url-exists');

urlExists('https://www.google.com', function(err, exists) {
  console.log(exists); // true 
});

urlExists('https://www.fakeurl.notreal', function(err, exists) {
  console.log(exists); // false 
});
Run Code Online (Sandbox Code Playgroud)

您还可以承诺它以利用awaitasync

const util = require('util');
const urlExists = util.promisify(require('url-exists'));

let isExists = await urlExists('https://www.google.com'); // true
isExists = await urlExists('https://www.fakeurl.notreal'); // false
Run Code Online (Sandbox Code Playgroud)

快乐编码!