From a28ead4cc1206d09b72aae10bbdfd947985fcf6d Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 23 Jan 2018 01:24:37 +0100 Subject: [PATCH] nicer async stack traces --- lib/request.js | 34 +++++++++++++++++++++++----------- package.json | 3 ++- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/lib/request.js b/lib/request.js index 0eccbb52..5190a912 100644 --- a/lib/request.js +++ b/lib/request.js @@ -1,14 +1,13 @@ 'use strict' +let captureStackTrace = () => {} +if (process.env.NODE_ENV === 'dev') { + captureStackTrace = require('capture-stack-trace') +} const Promise = require('pinkie-promise') const {fetch} = require('fetch-ponyfill')({Promise}) const {stringify} = require('query-string') -const hafasError = (err) => { - err.isHafasError = true - return err -} - const request = (profile, data) => { const body = profile.transformReqBody({lang: 'en', svcReqL: [data]}) const req = profile.transformReq({ @@ -24,20 +23,33 @@ const request = (profile, data) => { }) const url = profile.endpoint + (req.query ? '?' + stringify(req.query) : '') + // Async stack traces are not supported everywhere yet, so we create our own. + const err = new Error() + err.isHafasError = true + err.request = body + captureStackTrace(err) + return fetch(url, req) .then((res) => { + err.statusCode = res.status if (!res.ok) { - const err = new Error(res.statusText) - err.statusCode = res.status - throw hafasError(err) + err.message = res.statusText + throw err } return res.json() }) .then((b) => { - if (b.err) throw hafasError(new Error(b.err)) - if (!b.svcResL || !b.svcResL[0]) throw new Error('invalid response') + if (b.err) { + err.message = b.err + throw err + } + if (!b.svcResL || !b.svcResL[0]) { + err.message = 'invalid response' + throw err + } if (b.svcResL[0].err !== 'OK') { - throw hafasError(new Error(b.svcResL[0].errTxt)) + err.message = b.svcResL[0].errTxt + throw err } const d = b.svcResL[0].res const c = d.common || {} diff --git a/package.json b/package.json index a13c2d1d..daf7f0bb 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "node": ">=6" }, "dependencies": { + "capture-stack-trace": "^1.0.0", "fetch-ponyfill": "^4.1.0", "lodash": "^4.17.4", "luxon": "^0.3.1", @@ -55,7 +56,7 @@ "vbb-stations-autocomplete": "^3.0.0" }, "scripts": { - "test": "node test/index.js", + "test": "env NODE_ENV=dev node test/index.js", "prepublishOnly": "npm test | tap-spec" } }