diff --git a/packages/pg/lib/utils.js b/packages/pg/lib/utils.js index d63fe68f1..697d5f950 100644 --- a/packages/pg/lib/utils.js +++ b/packages/pg/lib/utils.js @@ -4,6 +4,8 @@ const crypto = require('crypto') const defaults = require('./defaults') +const util = require('util') + function escapeElement(elementRepresentation) { var escaped = elementRepresentation.replace(/\\/g, '\\\\').replace(/"/g, '\\"') @@ -52,7 +54,7 @@ var prepareValue = function (val, seen) { } return buf.slice(val.byteOffset, val.byteOffset + val.byteLength) // Node.js v4 does not support those Buffer.from params } - if (val instanceof Date) { + if (util.types.isDate(val)) { if (defaults.parseInputDatesAsUTC) { return dateToStringUTC(val) } else { diff --git a/packages/pg/test/integration/gh-issues/2862-tests.js b/packages/pg/test/integration/gh-issues/2862-tests.js new file mode 100644 index 000000000..d04117779 --- /dev/null +++ b/packages/pg/test/integration/gh-issues/2862-tests.js @@ -0,0 +1,27 @@ +'use strict' +var helper = require('./../test-helper') +var assert = require('assert') +var util = require('util') +var vm = require('vm'); + +const suite = new helper.Suite() + +suite.test('Handle date objects as Date', async (done) => { + const date = new Date(); + const dateObj = await vm.runInNewContext('new Date()'); + assert(!(dateObj instanceof Date)) + assert(util.types.isDate(dateObj)) + const client = new helper.pg.Client() + client.connect() + + await client.query('CREATE TEMP TABLE foo(bar TIMESTAMP, bar2 TIMESTAMP)') + await client.query('INSERT INTO foo(bar, bar2) VALUES($1, $2)', [date, dateObj]) + const results = await client.query('SELECT * FROM foo') + const row = results.rows[0] + const dbDate = row.bar + const dbDateObj = row.bar2 + assert.deepEqual(dbDate, date) + assert.deepEqual(dbDateObj, dateObj) + await client.end() + done() +})