From b8680bc1abf3d708f460aeb11f91f3876b12a1c8 Mon Sep 17 00:00:00 2001 From: pratyushsinghal7 Date: Fri, 24 Jul 2026 01:25:49 -0700 Subject: [PATCH] Fix JSON file error handling --- src/84from.js | 36 +++++++++++++++++++++++------------- test/test1314-invalid.txt | 1 + test/test1314.js | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 13 deletions(-) create mode 100644 test/test1314-invalid.txt create mode 100644 test/test1314.js diff --git a/src/84from.js b/src/84from.js index d749719a72..bb968f0544 100755 --- a/src/84from.js +++ b/src/84from.js @@ -153,22 +153,32 @@ alasql.from.JSON = function (filename, opts, cb, idx, query) { //console.log('cb',cb); //console.log('JSON'); filename = alasql.utils.autoExtFilename(filename, 'json', opts); - (alasql.utils.loadFile(filename, !!cb, function (data) { - // console.log('DATA:'+data); - // res = [{a:1}]; - res = JSON.parse(data); - if (cb) { - res = cb(res, idx, query); + const errorHandler = err => { + const error = err instanceof Error ? err : new Error(err); + if (query && query.cb) { + query.cb(null, error); + return; } - }), - err => { - const error = err instanceof Error ? err : new Error(err); - if (query && query.cb) { - query.cb(null, error); + throw error; + }; + alasql.utils.loadFile( + filename, + !!cb, + function (data) { + // console.log('DATA:'+data); + // res = [{a:1}]; + try { + res = JSON.parse(data); + } catch (error) { + errorHandler(error); return; } - throw error; - }); + if (cb) { + res = cb(res, idx, query); + } + }, + errorHandler + ); return res; }; diff --git a/test/test1314-invalid.txt b/test/test1314-invalid.txt new file mode 100644 index 0000000000..7c504910f4 --- /dev/null +++ b/test/test1314-invalid.txt @@ -0,0 +1 @@ +invalid JSON diff --git a/test/test1314.js b/test/test1314.js new file mode 100644 index 0000000000..5a85514cfb --- /dev/null +++ b/test/test1314.js @@ -0,0 +1,37 @@ +if (typeof exports === 'object') { + var assert = require('assert'); + var alasql = require('..'); +} else { + __dirname = '.'; +} + +describe('Test 1314 - JSON file errors', function () { + it('1. Rejects when the JSON file does not exist', async function () { + await assert.rejects( + alasql(['SELECT * FROM JSON("' + __dirname + '/test1314-missing.json")']), + function (error) { + return error instanceof Error && error.code === 'ENOENT'; + } + ); + }); + + it('2. Passes missing file errors to the query callback', function (done) { + alasql( + 'SELECT * FROM JSON("' + __dirname + '/test1314-missing.json")', + [], + function (result, error) { + assert.strictEqual(result, null); + assert(error instanceof Error); + assert.strictEqual(error.code, 'ENOENT'); + done(); + } + ); + }); + + it('3. Rejects when the JSON file is invalid', async function () { + await assert.rejects( + alasql(['SELECT * FROM JSON("' + __dirname + '/test1314-invalid.txt")']), + SyntaxError + ); + }); +});