Check Broken Links
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