2019-05-27 10:33:22 -07:00
|
|
|
var express = require('express')
|
|
|
|
|
, path = require('path')
|
|
|
|
|
, nodeapi = require('./lib/nodeapi')
|
|
|
|
|
, favicon = require('serve-favicon')
|
|
|
|
|
, logger = require('morgan')
|
|
|
|
|
, cookieParser = require('cookie-parser')
|
|
|
|
|
, bodyParser = require('body-parser')
|
|
|
|
|
, settings = require('./lib/settings')
|
|
|
|
|
, routes = require('./routes/index')
|
|
|
|
|
, lib = require('./lib/explorer')
|
|
|
|
|
, db = require('./lib/database')
|
2020-11-22 20:29:56 -07:00
|
|
|
, package_metadata = require('./package.json')
|
2019-05-27 10:33:22 -07:00
|
|
|
, locale = require('./lib/locale')
|
2020-12-08 22:52:15 -07:00
|
|
|
, request = require('postman-request');
|
2019-05-27 10:33:22 -07:00
|
|
|
|
|
|
|
|
var app = express();
|
|
|
|
|
|
|
|
|
|
// nodeapi
|
|
|
|
|
nodeapi.setWalletDetails(settings.wallet);
|
|
|
|
|
if (settings.heavy != true) {
|
|
|
|
|
nodeapi.setAccess('only', ['getinfo', 'getnetworkhashps', 'getmininginfo','getdifficulty', 'getconnectioncount',
|
|
|
|
|
'getmasternodecount', 'getmasternodelist', 'getvotelist', 'getblockcount', 'getblockhash', 'getblock', 'getrawtransaction',
|
2020-11-22 14:39:10 -07:00
|
|
|
'getpeerinfo', 'gettxoutsetinfo', 'verifymessage']);
|
2019-05-27 10:33:22 -07:00
|
|
|
} else {
|
|
|
|
|
// enable additional heavy api calls
|
|
|
|
|
/*
|
|
|
|
|
getvote - Returns the current block reward vote setting.
|
|
|
|
|
getmaxvote - Returns the maximum allowed vote for the current phase of voting.
|
|
|
|
|
getphase - Returns the current voting phase ('Mint', 'Limit' or 'Sustain').
|
|
|
|
|
getreward - Returns the current block reward, which has been decided democratically in the previous round of block reward voting.
|
|
|
|
|
getnextrewardestimate - Returns an estimate for the next block reward based on the current state of decentralized voting.
|
|
|
|
|
getnextrewardwhenstr - Returns string describing how long until the votes are tallied and the next block reward is computed.
|
|
|
|
|
getnextrewardwhensec - Same as above, but returns integer seconds.
|
|
|
|
|
getsupply - Returns the current money supply.
|
|
|
|
|
getmaxmoney - Returns the maximum possible money supply.
|
|
|
|
|
*/
|
|
|
|
|
nodeapi.setAccess('only', ['getinfo', 'getstakinginfo', 'getnetworkhashps', 'getdifficulty', 'getconnectioncount',
|
|
|
|
|
'getmasternodecount', 'getmasternodelist', 'getvotelist', 'getblockcount', 'getblockhash',
|
|
|
|
|
'getblock', 'getrawtransaction', 'getmaxmoney', 'getvote', 'getmaxvote', 'getphase', 'getreward', 'getpeerinfo',
|
2020-11-22 14:39:10 -07:00
|
|
|
'getnextrewardestimate', 'getnextrewardwhenstr', 'getnextrewardwhensec', 'getsupply', 'gettxoutsetinfo', 'verifymessage']);
|
2019-05-27 10:33:22 -07:00
|
|
|
}
|
|
|
|
|
// determine if cors should be enabled
|
|
|
|
|
if (settings.usecors == true) {
|
|
|
|
|
app.use(function(req, res, next) {
|
|
|
|
|
res.header("Access-Control-Allow-Origin", settings.corsorigin);
|
|
|
|
|
res.header('Access-Control-Allow-Methods', 'DELETE, PUT, GET, POST');
|
|
|
|
|
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
|
|
|
|
|
next();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
// view engine setup
|
|
|
|
|
app.set('views', path.join(__dirname, 'views'));
|
|
|
|
|
app.set('view engine', 'pug');
|
|
|
|
|
|
|
|
|
|
app.use(favicon(path.join(__dirname, settings.favicon)));
|
|
|
|
|
app.use(logger('dev'));
|
|
|
|
|
app.use(bodyParser.json());
|
|
|
|
|
app.use(bodyParser.urlencoded({ extended: true }));
|
|
|
|
|
app.use(cookieParser());
|
|
|
|
|
app.use(express.static(path.join(__dirname, 'public')));
|
|
|
|
|
|
|
|
|
|
// routes
|
|
|
|
|
app.use('/api', nodeapi.app);
|
|
|
|
|
app.use('/', routes);
|
2020-12-07 21:32:43 -07:00
|
|
|
app.use('/ext/getmoneysupply', function(req,res) {
|
|
|
|
|
lib.get_supply(function(supply) {
|
2020-05-22 12:01:02 -06:00
|
|
|
res.setHeader('content-type', 'text/plain');
|
2020-12-07 21:32:43 -07:00
|
|
|
res.end((supply ? supply.toString() : '0'));
|
2019-05-27 10:33:22 -07:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
app.use('/ext/getaddress/:hash', function(req,res){
|
2019-10-17 21:51:13 -06:00
|
|
|
db.get_address(req.params.hash, false, function(address){
|
2020-11-23 20:58:34 -07:00
|
|
|
db.get_address_txs_ajax(req.params.hash, 0, settings.txcount, function(txs, count){
|
|
|
|
|
if (address) {
|
|
|
|
|
var last_txs = [];
|
|
|
|
|
for(i=0; i<txs.length; i++){
|
|
|
|
|
if(typeof txs[i].txid !== "undefined") {
|
|
|
|
|
var out = 0,
|
|
|
|
|
vin = 0,
|
|
|
|
|
tx_type = 'vout',
|
|
|
|
|
row = {};
|
|
|
|
|
txs[i].vout.forEach(function (r) {
|
|
|
|
|
if (r.addresses == req.params.hash) {
|
|
|
|
|
out += r.amount;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
txs[i].vin.forEach(function (s) {
|
|
|
|
|
if (s.addresses == req.params.hash) {
|
|
|
|
|
vin += s.amount;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
if (vin > out) {
|
|
|
|
|
tx_type = 'vin';
|
|
|
|
|
}
|
|
|
|
|
row['addresses'] = txs[i].txid;
|
|
|
|
|
row['type'] = tx_type;
|
|
|
|
|
last_txs.push(row);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var a_ext = {
|
|
|
|
|
address: address.a_id,
|
|
|
|
|
sent: (address.sent / 100000000),
|
|
|
|
|
received: (address.received / 100000000),
|
|
|
|
|
balance: (address.balance / 100000000).toString().replace(/(^-+)/mg, ''),
|
|
|
|
|
last_txs: last_txs
|
|
|
|
|
};
|
|
|
|
|
res.send(a_ext);
|
|
|
|
|
} else {
|
|
|
|
|
res.send({ error: 'address not found.', hash: req.params.hash});
|
|
|
|
|
}
|
|
|
|
|
});
|
2019-05-27 10:33:22 -07:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2020-11-20 14:32:27 -07:00
|
|
|
app.use('/ext/gettx/:txid', function(req, res) {
|
2020-11-20 17:56:28 -07:00
|
|
|
var txid = req.params.txid;
|
2020-11-20 14:32:27 -07:00
|
|
|
db.get_tx(txid, function(tx) {
|
|
|
|
|
if (tx) {
|
|
|
|
|
lib.get_blockcount(function(blockcount) {
|
2020-12-07 21:32:43 -07:00
|
|
|
res.send({ active: 'tx', tx: tx, confirmations: settings.confirmations, blockcount: (blockcount ? blockcount : 0)});
|
2020-11-20 14:32:27 -07:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
lib.get_rawtransaction(txid, function(rtx) {
|
2020-12-07 21:32:43 -07:00
|
|
|
if (rtx && rtx.txid) {
|
2020-11-20 14:32:27 -07:00
|
|
|
lib.prepare_vin(rtx, function(vin) {
|
|
|
|
|
lib.prepare_vout(rtx.vout, rtx.txid, vin, function(rvout, rvin) {
|
|
|
|
|
lib.calculate_total(rvout, function(total){
|
|
|
|
|
if (!rtx.confirmations > 0) {
|
|
|
|
|
var utx = {
|
|
|
|
|
txid: rtx.txid,
|
|
|
|
|
vin: rvin,
|
|
|
|
|
vout: rvout,
|
|
|
|
|
total: total.toFixed(8),
|
|
|
|
|
timestamp: rtx.time,
|
|
|
|
|
blockhash: '-',
|
|
|
|
|
blockindex: -1,
|
|
|
|
|
};
|
|
|
|
|
res.send({ active: 'tx', tx: utx, confirmations: settings.confirmations, blockcount:-1});
|
|
|
|
|
} else {
|
|
|
|
|
var utx = {
|
|
|
|
|
txid: rtx.txid,
|
|
|
|
|
vin: rvin,
|
|
|
|
|
vout: rvout,
|
|
|
|
|
total: total.toFixed(8),
|
|
|
|
|
timestamp: rtx.time,
|
|
|
|
|
blockhash: rtx.blockhash,
|
|
|
|
|
blockindex: rtx.blockheight,
|
|
|
|
|
};
|
|
|
|
|
lib.get_blockcount(function(blockcount) {
|
2020-12-07 21:32:43 -07:00
|
|
|
res.send({ active: 'tx', tx: utx, confirmations: settings.confirmations, blockcount: (blockcount ? blockcount : 0)});
|
2020-11-20 14:32:27 -07:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
res.send({ error: 'tx not found.', hash: txid});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2019-05-27 10:33:22 -07:00
|
|
|
app.use('/ext/getbalance/:hash', function(req,res){
|
2019-10-17 21:51:13 -06:00
|
|
|
db.get_address(req.params.hash, false, function(address){
|
2019-05-27 10:33:22 -07:00
|
|
|
if (address) {
|
2020-05-22 12:01:02 -06:00
|
|
|
res.setHeader('content-type', 'text/plain');
|
|
|
|
|
res.end((address.balance / 100000000).toString().replace(/(^-+)/mg, ''));
|
2019-05-27 10:33:22 -07:00
|
|
|
} else {
|
|
|
|
|
res.send({ error: 'address not found.', hash: req.params.hash})
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
app.use('/ext/getdistribution', function(req,res){
|
|
|
|
|
db.get_richlist(settings.coin, function(richlist){
|
|
|
|
|
db.get_stats(settings.coin, function(stats){
|
|
|
|
|
db.get_distribution(richlist, stats, function(dist){
|
|
|
|
|
res.send(dist);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
app.use('/ext/getcurrentprice', function(req,res){
|
|
|
|
|
db.get_stats(settings.coin, function (stats) {
|
|
|
|
|
eval('var p_ext = { "last_price_'+settings.markets.exchange.toLowerCase()+'": stats.last_price, "last_price_usd": stats.last_usd_price, }');
|
|
|
|
|
res.send(p_ext);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2020-12-07 21:32:43 -07:00
|
|
|
app.use('/ext/getbasicstats', function(req,res) {
|
|
|
|
|
lib.get_blockcount(function(blockcount) {
|
|
|
|
|
lib.get_supply(function(supply) {
|
|
|
|
|
db.get_stats(settings.coin, function (stats) {
|
|
|
|
|
lib.get_masternodecount(function(masternodestotal) {
|
|
|
|
|
eval('var p_ext = { "block_count": (blockcount ? blockcount : 0), "money_supply": (supply ? supply : 0), "last_price_'+settings.markets.exchange.toLowerCase()+'": stats.last_price, "last_price_usd": stats.last_usd_price, "masternode_count": masternodestotal.total }');
|
2019-06-07 20:05:28 -06:00
|
|
|
res.send(p_ext);
|
|
|
|
|
});
|
2020-12-07 21:32:43 -07:00
|
|
|
});
|
2019-06-07 20:05:28 -06:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2020-11-28 20:40:37 -07:00
|
|
|
app.use('/ext/getlasttxs/:min', function(req, res) {
|
|
|
|
|
db.get_last_txs(req, function(data, draw, count) {
|
|
|
|
|
res.json({"data":data, "draw": draw, "recordsTotal": count, "recordsFiltered": count});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
app.use('/ext/getlasttxsajax/:min', function(req, res){
|
|
|
|
|
db.get_last_txs(req, function(data, draw, count) {
|
|
|
|
|
res.json({"data":data, "draw": draw, "recordsTotal": count, "recordsFiltered": count});
|
2020-11-20 17:32:06 -07:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2020-11-20 16:40:59 -07:00
|
|
|
app.use('/ext/getaddresstxsajax/:address', function(req,res){
|
2020-11-20 11:02:27 -07:00
|
|
|
req.query.length = parseInt(req.query.length);
|
2020-11-20 16:28:28 -07:00
|
|
|
if(isNaN(req.query.length) || req.query.length > settings.txcount){
|
2020-11-19 21:37:42 -07:00
|
|
|
req.query.length = settings.txcount;
|
|
|
|
|
}
|
2020-11-20 16:40:59 -07:00
|
|
|
if(isNaN(req.query.start) || req.query.start < 0){
|
|
|
|
|
req.query.start = 0;
|
|
|
|
|
}
|
|
|
|
|
db.get_address_txs_ajax(req.params.address, req.query.start, req.query.length,function(txs, count){
|
2020-11-19 21:37:42 -07:00
|
|
|
var data = [];
|
|
|
|
|
for(i=0; i<txs.length; i++){
|
|
|
|
|
if(typeof txs[i].txid !== "undefined") {
|
|
|
|
|
var out = 0
|
|
|
|
|
var vin = 0
|
|
|
|
|
|
|
|
|
|
txs[i].vout.forEach(function (r) {
|
2020-11-20 16:40:59 -07:00
|
|
|
if (r.addresses == req.params.address) {
|
2020-11-20 16:28:28 -07:00
|
|
|
out += r.amount;
|
2020-11-19 21:37:42 -07:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
txs[i].vin.forEach(function (s) {
|
2020-11-20 16:40:59 -07:00
|
|
|
if (s.addresses == req.params.address) {
|
2020-11-20 16:28:28 -07:00
|
|
|
vin += s.amount
|
2020-11-19 21:37:42 -07:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var row = [];
|
|
|
|
|
row.push(new Date((txs[i].timestamp) * 1000).toUTCString());
|
|
|
|
|
row.push(txs[i].txid);
|
|
|
|
|
row.push(out);
|
|
|
|
|
row.push(vin);
|
2020-11-20 16:50:53 -07:00
|
|
|
row.push(txs[i].balance);
|
2020-11-19 21:37:42 -07:00
|
|
|
data.push(row);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
res.json({"data":data, "draw": req.query.draw, "recordsTotal": count, "recordsFiltered": count});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2020-11-22 14:39:10 -07:00
|
|
|
app.post('/address/:hash/claim', function(req, res){
|
|
|
|
|
var address = req.body.address;
|
|
|
|
|
var signature = req.body.signature;
|
|
|
|
|
var message = req.body.message;
|
2020-11-29 19:29:38 -07:00
|
|
|
|
|
|
|
|
request({ url: 'http://127.0.0.1:' + settings.port + '/api/verifymessage?address='+address+ '&signature='+ signature + '&message=' + message, method: 'GET'}, function(error, response, body) {
|
|
|
|
|
if (body == 'There was an error. Check your console.')
|
|
|
|
|
res.json({"status": "failed", "error": true, "message": body});
|
|
|
|
|
else if (body == "false") {
|
|
|
|
|
res.json({"status": "failed", "error": true, "message": error});
|
|
|
|
|
} else if(body == "true") {
|
|
|
|
|
db.update_label(address, message, function() {
|
2020-11-22 14:39:10 -07:00
|
|
|
res.json({"status": "success"});
|
2020-11-29 19:29:38 -07:00
|
|
|
});
|
2020-11-22 14:39:10 -07:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
})
|
|
|
|
|
|
2019-05-27 10:33:22 -07:00
|
|
|
app.use('/ext/connections', function(req,res){
|
|
|
|
|
db.get_peers(function(peers){
|
|
|
|
|
res.send({data: peers});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// locals
|
|
|
|
|
app.set('title', settings.title);
|
2020-11-22 20:29:56 -07:00
|
|
|
app.set('explorer_version', package_metadata.version);
|
2019-05-27 10:33:22 -07:00
|
|
|
app.set('symbol', settings.symbol);
|
|
|
|
|
app.set('coin', settings.coin);
|
|
|
|
|
app.set('locale', locale);
|
|
|
|
|
app.set('display', settings.display);
|
|
|
|
|
app.set('markets', settings.markets);
|
|
|
|
|
app.set('twitter', settings.twitter);
|
|
|
|
|
app.set('facebook', settings.facebook);
|
|
|
|
|
app.set('googleplus', settings.googleplus);
|
|
|
|
|
app.set('bitcointalk', settings.bitcointalk);
|
|
|
|
|
app.set('github', settings.github);
|
|
|
|
|
app.set('slack', settings.slack);
|
|
|
|
|
app.set('discord', settings.discord);
|
|
|
|
|
app.set('telegram', settings.telegram);
|
|
|
|
|
app.set('reddit', settings.reddit);
|
|
|
|
|
app.set('youtube', settings.youtube);
|
|
|
|
|
app.set('website', settings.website);
|
|
|
|
|
|
|
|
|
|
app.set('genesis_block', settings.genesis_block);
|
|
|
|
|
app.set('index', settings.index);
|
2020-11-20 18:43:30 -07:00
|
|
|
app.set('use_rpc', settings.use_rpc);
|
2019-05-27 10:33:22 -07:00
|
|
|
app.set('heavy', settings.heavy);
|
2020-12-08 20:49:06 -07:00
|
|
|
app.set('save_stats_after_sync_blocks', settings.save_stats_after_sync_blocks);
|
2020-11-20 16:28:28 -07:00
|
|
|
app.set('lock_during_index', settings.lock_during_index);
|
2019-05-27 10:33:22 -07:00
|
|
|
app.set('txcount', settings.txcount);
|
2020-11-20 18:18:36 -07:00
|
|
|
app.set('txcount_per_page', settings.txcount_per_page);
|
2019-05-27 10:33:22 -07:00
|
|
|
app.set('nethash', settings.nethash);
|
|
|
|
|
app.set('nethash_units', settings.nethash_units);
|
|
|
|
|
app.set('show_sent_received', settings.show_sent_received);
|
|
|
|
|
app.set('logo', settings.logo);
|
|
|
|
|
app.set('theme', settings.theme);
|
|
|
|
|
app.set('labels', settings.labels);
|
|
|
|
|
app.set('homelink', settings.homelink);
|
|
|
|
|
app.set('logoheight', settings.logoheight);
|
2019-06-24 19:52:15 -06:00
|
|
|
app.set('burned_coins', settings.burned_coins);
|
2020-12-07 21:32:43 -07:00
|
|
|
app.set('api_cmds', settings.api_cmds);
|
2019-05-27 10:33:22 -07:00
|
|
|
|
2020-12-05 20:10:17 -07:00
|
|
|
app.set('footer_height_desktop', settings.footer_height_desktop);
|
|
|
|
|
app.set('footer_height_tablet', settings.footer_height_tablet);
|
|
|
|
|
app.set('footer_height_mobile', settings.footer_height_mobile);
|
|
|
|
|
|
|
|
|
|
app.set('social_link_percent_height_desktop', settings.social_link_percent_height_desktop);
|
|
|
|
|
app.set('social_link_percent_height_tablet', settings.social_link_percent_height_tablet);
|
|
|
|
|
app.set('social_link_percent_height_mobile', settings.social_link_percent_height_mobile);
|
|
|
|
|
|
2019-05-27 10:33:22 -07:00
|
|
|
// determine panel offset based on which panels are enabled
|
|
|
|
|
var paneltotal=5;
|
|
|
|
|
var panelcount=(settings.display.networkpnl > 0 ? 1 : 0)+(settings.display.difficultypnl > 0 ? 1 : 0)+(settings.display.masternodespnl > 0 ? 1 : 0)+(settings.display.coinsupplypnl > 0 ? 1 : 0)+(settings.display.pricepnl > 0 ? 1 : 0);
|
|
|
|
|
app.set('paneloffset', paneltotal+1-panelcount);
|
|
|
|
|
|
|
|
|
|
// determine panel order
|
|
|
|
|
var panelorder = new Array();
|
|
|
|
|
if (settings.display.networkpnl > 0) panelorder.push({name: 'networkpnl', val: settings.display.networkpnl});
|
|
|
|
|
if (settings.display.difficultypnl > 0) panelorder.push({name: 'difficultypnl', val: settings.display.difficultypnl});
|
|
|
|
|
if (settings.display.masternodespnl > 0) panelorder.push({name: 'masternodespnl', val: settings.display.masternodespnl});
|
|
|
|
|
if (settings.display.coinsupplypnl > 0) panelorder.push({name: 'coinsupplypnl', val: settings.display.coinsupplypnl});
|
|
|
|
|
if (settings.display.pricepnl > 0) panelorder.push({name: 'pricepnl', val: settings.display.pricepnl});
|
|
|
|
|
panelorder.sort(function(a,b) { return a.val - b.val; });
|
|
|
|
|
for (var i=1; i<6; i++) {
|
|
|
|
|
app.set('panel'+i.toString(), ((panelorder.length >= i) ? panelorder[i-1].name : ''));
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-05 17:39:14 -07:00
|
|
|
// Dynamically populate market names
|
|
|
|
|
var market_names = {};
|
|
|
|
|
|
|
|
|
|
settings.markets.enabled.forEach(function (market) {
|
|
|
|
|
// Check if market file exists
|
2020-12-08 22:52:15 -07:00
|
|
|
if (db.fs.existsSync('./lib/markets/' + market + '.js')) {
|
2020-12-05 17:39:14 -07:00
|
|
|
// Load market file
|
|
|
|
|
var exMarket = require('./lib/markets/' + market);
|
|
|
|
|
// Save market_name from market file to settings
|
|
|
|
|
eval('market_names.' + market + ' = "' + exMarket.market_name + '";');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
app.set('market_names', market_names);
|
|
|
|
|
|
2019-05-27 10:33:22 -07:00
|
|
|
// catch 404 and forward to error handler
|
|
|
|
|
app.use(function(req, res, next) {
|
|
|
|
|
var err = new Error('Not Found');
|
|
|
|
|
err.status = 404;
|
|
|
|
|
next(err);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// development error handler
|
|
|
|
|
// will print stacktrace
|
|
|
|
|
if (app.get('env') === 'development') {
|
|
|
|
|
app.use(function(err, req, res, next) {
|
|
|
|
|
res.status(err.status || 500);
|
|
|
|
|
res.render('error', {
|
|
|
|
|
message: err.message,
|
|
|
|
|
error: err
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// production error handler
|
|
|
|
|
// no stacktraces leaked to user
|
|
|
|
|
app.use(function(err, req, res, next) {
|
|
|
|
|
res.status(err.status || 500);
|
|
|
|
|
res.render('error', {
|
|
|
|
|
message: err.message,
|
|
|
|
|
error: {}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2020-11-20 16:28:28 -07:00
|
|
|
module.exports = app;
|