亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

NodeJS url驗證(url-valid)的使用方法

2019-11-20 21:40:31
字體:
來源:轉載
供稿:網友
Javascript做url檢驗,通常是使用正則表達式來判定,其格式是否正確,例如:
復制代碼 代碼如下:

/^https?://///.test(url);

當然還有更好的檢測方法比如基于RFC 3986, RFC 3966, RFC 4694, RFC 4759, RFC 4904等標準的進行驗證的valid-url庫。
不過個根據格式進行驗證當然不能確定該url是否存在啦,所以就有了url-valid,我們基于HTTP請求進行驗證。

接口設計
實際上我們只需要一個函數傳入一個url地址,并回調返回該鏈接是否可用。
但請求容易產生未知錯誤,所以我們在回調函數傳入一個error參數,如果不為空,則有錯誤產生。
我們可能還希望能夠得到網頁的相關數據,未來用在頁面的信息提取上。
盡可能鏈式操作吧。
所以最后使用上大概是這樣的:
復制代碼 代碼如下:

valid(url)
  .on('check', function (err, status) {
    if (err) throw err;
    status ?
      console.log('url是可用的') :
      console.log('url是不可用的');
  })
  .on('data', function (err, data) {
    console.log(data);
  })
  .on('end', function (err, data) {
    console.log('請求結束');
  })

HTTP GET 還是 HTTP HEAD
本來我們想利用HTTP HEAD請求來實現的,因為HEAD請求只會返回頭信息,這可以減少請求時間,但是HEAD請求,不一定所有鏈接都會支持。
所以最后我們使用HTTP GET方式,在得到正確的statusCode后立刻abort掉請求。

處理301-303
因為301到303都是重定向狀態所以,我們需要繼續檢查對應Location是否依然存在。

利用process.nextTick異步執行
為了在注冊監聽后,再執行代碼,我們使用process.nextTick來一步操作。

實現
復制代碼 代碼如下:

/*!
 * valid
 * MIT Licensed
 */
module.exports = (function () {
  'use strict';
  var http = require('http')
    , https = require('https')
    , EventEmitter = require('events').EventEmitter
    , URL = require('url')
    , urlReg = /^(https?)://///;

  /**
   * Valid
   * @class
   */
  function Valid(url, callback) {
    var that = this;
    this.url = url;
    this.emitter = new EventEmitter();
    process.nextTick(function () {
      that.get(url);
    });
    this.fetch = false;
    callback && this.emitter.on('check', callback);
  }
  Valid.prototype = {
    constructor: Valid,
    /**
     * get
     * @param {String} url
     */
    get: function (url) {
      var match = url.match(urlReg)
        , that = this;
      if (match) {
        var httpLib = (match[1].toLowerCase() === 'http') ? http : https
          , opts = URL.parse(url)
          , req;
        opts.agent = false;
        opts.method = 'GET';
        req = httpLib.request(opts, function (res) {
          var statusCode = res.statusCode;
          if (statusCode === 200) {
            that.emitter.emit('check', null, true);
            that.fetch ?
              (res.on('data', function (data) {
                that.emitter.emit('data', null, data);
              }) && res.on('end', function () {
                that.emitter.emit('end');
              })) :
              (req.abort() || that.emitter.emit('end'));
          } else if (300 < statusCode && statusCode < 304) {
            req.abort();
            var emitter = that.emitter
              , valid = one(URL.resolve(url, res.headers.location), function (err, valid) {
                emitter.emit('check', err, valid);
              });
            that.fetch && valid.on('data', function (err, data) {
              emitter.emit('data', err, data);
            });
            valid.on('error', function (err) {
              that.emitter.emit('error', err);
            });
            valid.on('end', function () {
              that.emitter.emit('end');
            });
          } else {
            that.emitter.emit('check', null, false);
          }
          res.on('error', function (err) {
            req.abort();
            that.emitter.emit('data', err);
          });
        });
        req.on('error', function (err) {
          req.abort();
          return that.emitter.emit('check', null, false);
        });
        req.end();
      } else {
        return that.emitter.emit('check', null, false);
      }
    },
    /**
     * on
     * @param {Stirng} event
     * @param {Function} callback
     */
    on: function (event, callback) {
      (event === 'data') && (this.fetch = true);
      this.emitter.on(event, callback);
      return this;
    },
    /**
     * destroy
     */
    destroy: function () {
      this.emitter.removeAllListeners();
      this.url = undefined;
      this.emitter = null;
      this.fetch = undefined;
    },
    /**
     * removeAllListeners
     * @param
     */
    removeAllListeners: function (event) {
      event ?
        this.emitter.removeAllListeners(event) :
        this.emitter.removeAllListeners();
      return this;
    },
    /**
     * listeners
     * @param
     */
    listeners: function (event) {
      if (event) {
        return this.emitter.listeners(event);
      } else {
        var res = []
          , that = this
          , _push = Array.prototype.push;
        Object.keys(this.emitter._events).forEach(function (key) {
          _push.apply(res, that.emitter.listeners(key));
        });
        return res;
      }
    }
  }
  /**
   * one
   * @param {String} url
   * @param {Function} callback
   * @return {Valid}
   */
  function one(url, callback) {
    return (new Valid(url, callback));
  }
  one.one = one;
  return one;
})();
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩国产激情在线| 欧美激情喷水视频| 日韩精品小视频| 国产精品一区二区三区久久| 日韩高清电影免费观看完整| 欧美制服第一页| 91tv亚洲精品香蕉国产一区7ujn| 欧美日韩精品在线视频| 成人国产在线视频| 久久九九国产精品怡红院| 日韩中文字幕视频| 国产婷婷97碰碰久久人人蜜臀| 午夜精品一区二区三区在线| 亚洲美女av在线| 久久人人爽人人爽爽久久| 成人中文字幕+乱码+中文字幕| 欧美性猛交xxxxx免费看| 日韩中文字幕在线视频播放| 神马国产精品影院av| 成人动漫网站在线观看| 成人激情在线播放| 亚洲iv一区二区三区| 久久视频国产精品免费视频在线| 久久激情视频久久| 国产美女精彩久久| 欧美在线视频导航| 久久夜精品va视频免费观看| 国产精品久久久久91| 中文字幕亚洲欧美| 欧美肥臀大乳一区二区免费视频| 国产精品丝袜白浆摸在线| 九九热精品视频在线播放| 国产精品一区二区久久| 亚洲黄页视频免费观看| 91精品国产自产在线老师啪| 精品国产91久久久| 国产日韩欧美中文| 91影视免费在线观看| 欧美一区亚洲一区| 国产一区二区三区精品久久久| 欧美日韩在线第一页| 最近2019年好看中文字幕视频| 久久精品人人爽| 孩xxxx性bbbb欧美| 日韩成人在线电影网| 国模gogo一区二区大胆私拍| 成人情趣片在线观看免费| 精品福利在线观看| 在线播放国产一区中文字幕剧情欧美| 久久久久久久久久久亚洲| 影音先锋欧美在线资源| 亚洲欧美变态国产另类| 国产精品免费福利| 日韩大片在线观看视频| 欧美精品一区二区三区国产精品| 色噜噜国产精品视频一区二区| 久久久久久有精品国产| 欧美精品国产精品日韩精品| 国产精品视频最多的网站| 国产丝袜一区二区三区| 在线中文字幕日韩| 中文字幕久热精品在线视频| 久久亚洲精品小早川怜子66| 亚洲free嫩bbb| 日韩欧美在线视频免费观看| 欧美激情在线播放| 国产a级全部精品| 亚洲视频国产视频| 欧美日韩高清在线观看| 精品视频9999| 欧美精品一区在线播放| 久久精品国产精品亚洲| 日韩美女写真福利在线观看| 久热在线中文字幕色999舞| 在线成人激情黄色| 成人午夜两性视频| 日韩高清电影免费观看完整版| 91精品免费久久久久久久久| 中文字幕成人在线| 日韩av理论片| 日韩中文在线中文网在线观看| 久久影院资源站| 日韩成人激情影院| 国产精品久久久久999| 亚洲热线99精品视频| 日韩精品小视频| www.亚洲一区| 欧美久久精品午夜青青大伊人| 国产69精品久久久久99| 91理论片午午论夜理片久久| 国产精品久久久久久久久久新婚| 国产精品女人久久久久久| 亚洲一区二区黄| 亚洲国产免费av| 国产视频精品免费播放| 久久精品视频va| 久久69精品久久久久久久电影好| 九九热视频这里只有精品| 久久久av亚洲男天堂| 亚洲一区二区三区在线视频| 国产精品极品在线| 视频在线一区二区| 国产成人精品电影久久久| 成人免费高清完整版在线观看| 精品久久香蕉国产线看观看gif| 久久久久亚洲精品成人网小说| 欧美精品久久久久久久久久| 性夜试看影院91社区| 中文在线不卡视频| 国产成人在线亚洲欧美| 亚洲人成电影在线观看天堂色| 欧美一级大胆视频| 97精品伊人久久久大香线蕉| 亚洲自拍偷拍一区| 欧美性xxxx极品高清hd直播| 亚洲色图欧美制服丝袜另类第一页| 亚洲欧美国产高清va在线播| 97香蕉超级碰碰久久免费软件| 欧美国产日韩一区二区三区| 亚洲少妇中文在线| 5278欧美一区二区三区| 成人国产精品一区二区| 久久这里有精品视频| 2020国产精品视频| 亚洲天堂色网站| 国产精品视频99| 久久天堂av综合合色| 亚洲九九九在线观看| 在线成人中文字幕| 欧美另类暴力丝袜| 亚洲精品成人免费| 亚洲精品日韩激情在线电影| 欧洲中文字幕国产精品| 欧美一级片免费在线| 欧美在线播放视频| 亚洲精品久久7777777| 97国产精品视频| 欧美在线一区二区视频| 欧美一区二区三区图| 伊人久久大香线蕉av一区二区| 岛国av一区二区在线在线观看| 欧美日韩在线视频一区二区| 国内精品小视频| 亚洲天堂网站在线观看视频| 日韩免费视频在线观看| 精品国产欧美一区二区五十路| 日韩成人在线视频网站| 日韩免费精品视频| 亚洲丝袜av一区| 日韩精品在线观看视频| 成人激情av在线| 欧美丝袜第一区| 91欧美视频网站| 在线视频日本亚洲性| 色噜噜久久综合伊人一本| 高清视频欧美一级| 国产精品大片wwwwww| 91chinesevideo永久地址| 久久久久久免费精品| 国产999精品视频| 成年人精品视频| 最新国产精品拍自在线播放| 亚洲国产精品99久久| 日本久久亚洲电影|