Check array of links for contained broken links.


Keywords
broken, link, checker, test, mocha, promise
License
MIT
Install
npm install check-broken-links@2.0.4

Documentation

Check Broken Links

Build Status

An npm package that checks an array of supplied links for broken links.

const check = require( 'check-broken-links' )
const containsBroken = [
    'https://www.iCONTAINbrokenlinks.com',
    'https://www.iAMbroken.com',
    'https://www.iamfine.com'
]
check( 'https://base.url/', containsBroken ).then( brokenlinks => {
    console.log( brokenlinks )
    /*
    { top: [ { url: 'https://www.iAMbroken.com', err: [Object] } ],
      crawled:
       [ { link: 'https://iwasinside.com/iCONTAINbrokenlinks ',
           sources: [ 'https://iwasfoundinthislinkyou supplied.com', 'https://butalsointhisone.com' ] }
      ] },
      allchecked: { [ link: '', sources: [] ] } // This would obviously be populated
    */
} )

The base url for the relative links has a required trailing slash.

Mocha testing example

Let's say you want to check if your project has any broken links:

// Get polyfill so we can use full ES6 in the tests
import 'babel-polyfill'

// Get the expect functionality
import { expect } from 'chai'

// Display results as table
import 'console.table'

// Import the link checker
const check = require( 'check-broken-links' )

// We do not use arrow syntax here because that would break the this.timeout
describe( 'Links in the project', function( ) {

  // Set the timeouts high so that all links can be checked without many or slow requests crashing the test
  this.timeout( process.env.maxtimeout || ( 1000 * 60 * 5 ) )

  // Of course you would do some dynamic stuff to find links in the test below
  let yourlinks = []

  // The current setup uses mocha in a promise fashion
  // You could also have the callback be done => {}, but then need to call done() after the expect()
  it( 'All return 200', () => {
    return check( yourlinks )
    .then( brokenlinkarray => {
      if ( broken.top.length > 0 ) console.log( 'Broken Top levels' ); console.table( broken.top )
      if ( broken.crawled.length > 0 ) console.log( 'Broken crawled links' ); console.table( broken.crawled )
      expect( broken.crawled.length ).to.equal( 0 )
      expect( broken.top.length ).to.equal( 0 )
    } )
  } )
} )

Configuration

Want the module to console.log every request set the environment variable 'verbose' to true:

verbose=true node app.js 

This will log out every request. Successfull requests turn green, failed ones red.

The GET requests have a default timeout of 60 seconds. You can set this using the 'gettimeout' environment variable in seconds.

# 2 minute timeout
gettimeout=120 node app.js