2014-09-24 136 views
12

如何检查网址是否存在但不拉下?我使用下面的代码,但它下载整个文件。我只需要检查它是否存在。node.js检查是否存在远程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); 

    }); 

}); 

感谢任何帮助!

+2

您可以执行HEAD请求而不是GET。无论你在那里使用哪个模块,我都会想象他们会为它提供一个简单的界面。 – 2014-09-24 01:39:55

回答

24

试试这个:

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(); 
+0

太好了,谢谢。 – metalaureate 2014-09-24 03:29:21

+3

opts!= options;) – 2015-03-06 11:42:36

9

谢谢!这是封装在一个函数(更新于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(); 
    } 

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

+1

您不应该在函数体内使用'require',因为它是同步的。 – Westy92 2017-05-30 02:45:12

+1

现有的资源或URL可以返回不同于200的状态,仍然有效 – 2017-08-08 14:57:09

2

'要求'功能在节点中是错误的方式。 其次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(); 
} 
+0

不知道,但这似乎是检查链接错误的最好方法! – peterb 2017-09-04 09:53:12

5

只需使用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 
}); 
+1

更清洁。感谢分享! – Sebyddd 2017-11-22 23:51:11

+0

是否有与同步呼叫一起使用的选项? – 2017-12-04 09:21:27

0
使用其他响应作为参考

,这里有一个promisified版本,还与https的URI(节点6+):

const http = require('http'); 
const https = require('https'); 
const url = require('url'); 

const request = (opts = {}, cb) => { 
    const requester = opts.protocol === 'https:' ? https : http; 
    return requester.request(opts, cb); 
}; 

module.exports = target => new Promise((resolve, reject) => { 
    let uri; 

    try { 
    uri = url.parse(target); 
    } catch (err) { 
    reject(new Error(`Invalid url ${target}`)); 
    } 

    const options = { 
    method: 'HEAD', 
    host: uri.host, 
    protocol: uri.protocol, 
    port: uri.port, 
    path: uri.path, 
    timeout: 5 * 1000, 
    }; 

    const req = request(options, (res) => { 
    const { statusCode } = res; 

    if (statusCode >= 200 && statusCode < 300) { 
     resolve(target); 
    } else { 
     reject(new Error(`Url ${target} not found.`)); 
    } 
    }); 

    req.on('error', reject); 

    req.end(); 
}); 
0

看看在URL的存在 NPM包https://www.npmjs.com/package/url-exists

设置:

$ npm install url-exists 

用途:

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 
}); 

您也可以promisify它利用等待async

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 

快乐编码!