Skip to content

TypeError: raw.sql.replace is not a function #1126

@jeff-kilbride

Description

@jeff-kilbride

Hi Koskimas,

I upgraded to v1.3.0 today and am now getting the following error, which I think is related to the change in #1077:

TypeError: raw.sql.replace is not a function
    at replaceRawArrBindings (/Users/jeff/VSCode/api/node_modules/knex/lib/raw.js:151:21)
    at Raw.toSQL (/Users/jeff/VSCode/api/node_modules/knex/lib/raw.js:107:13)
    at Formatter.unwrapRaw (/Users/jeff/VSCode/api/node_modules/knex/lib/formatter.js:127:21)
    at Formatter.wrap (/Users/jeff/VSCode/api/node_modules/knex/lib/formatter.js:159:20)
    at QueryCompiler_MySQL.onBasic (/Users/jeff/VSCode/api/node_modules/knex/lib/query/compiler.js:523:119)
    at QueryCompiler_MySQL.join (/Users/jeff/VSCode/api/node_modules/knex/lib/query/compiler.js:305:39)
    at /Users/jeff/VSCode/api/node_modules/knex/lib/query/compiler.js:127:31
    at Array.map (<anonymous>)
    at QueryCompiler_MySQL.select (/Users/jeff/VSCode/api/node_modules/knex/lib/query/compiler.js:126:33)
    at QueryCompiler_MySQL.toSQL (/Users/jeff/VSCode/api/node_modules/knex/lib/query/compiler.js:74:27)
    at Builder.toSQL (/Users/jeff/VSCode/api/node_modules/knex/lib/query/builder.js:70:44)
    at /Users/jeff/VSCode/api/node_modules/knex/lib/runner.js:39:32
    at tryCatcher (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/util.js:16:23)
    at /Users/jeff/VSCode/api/node_modules/bluebird/js/release/using.js:185:26
    at tryCatcher (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromise0 (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/promise.js:694:18)
    at Promise._fulfill (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/promise.js:638:18)
    at PromiseArray._resolve (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/promise_array.js:126:19)
    at PromiseArray._promiseFulfilled (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/promise_array.js:144:14)
    at Promise._settlePromise (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/promise.js:574:26)
    at Promise._settlePromise0 (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/promise.js:694:18)
    at _drainQueueStep (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/async.js:138:12)
    at _drainQueue (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/async.js:131:9)
    at Async._drainQueues (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/async.js:147:5)
    at Immediate.Async.drainQueues (/Users/jeff/VSCode/api/node_modules/bluebird/js/release/async.js:17:14)

Here is the function from my code failing the tests:

    static getRevenueSitesDetail(accountId, params) {
        const order = _order.has(params.order) ? params.order : 'trans';
        const dir = _dir.has(params.dir) ? params.dir : 'desc';
        const order2 = order !== 'raw' && order !== 'unique' ? 'raw' : 'trans';

        let limit = Number(params.limit) || 20;
        let page = Number(params.page) || 1;

        // Ensure limit is sane.
        if (limit > 100) {
            limit = 100;
        } else if (limit < 1) {
            limit = 1;
        }

        // Ensure page is sane.
        if (page < 1) {
            page = 1;
        }

        // Create a UNION ALL of agg_aff_trans and agg_aff_hit as a derived table.
        const derived = AggAffTrans.query()
            .select(
                'landing_page',
                'count',
                'amount',
                AggAffTrans.raw('0 as `raw`'),
                AggAffTrans.raw('0 as `unique`')
            )
            .where({
                affiliate_id: accountId,
                site_id: params.id,
            })
            .andWhere('date', '>=', params.start)
            .andWhere('date', '<', params.end)
            .unionAll(
                AggAffHit.query()
                    .select(
                        'landing_page', 
                        AggAffHit.raw('0'), 
                        AggAffHit.raw('0'), 
                        'raw', 
                        'unique'
                    )
                    .where({
                        affiliate_id: accountId,
                        site_id: params.id,
                    })
                    .andWhere('date', '>=', params.start)
                    .andWhere('date', '<', params.end)
                    .andWhere('landing_page', '!=', 2) // exclude 'Payment Gateway'
            )
            .as('d');

        // Combine the derived table with agg_aff_lookup.
        const query = AggAffLookup.query()
            .alias('l')
            .select('l.value as landing_page', 's.title as site', 's.domain as domain')
            .sum('d.count as trans')
            .sum('d.amount as payout')
            .sum('d.raw as raw')
            .sum('d.unique as unique')
            .join('sites as s', 's.id', AggAffLookup.raw(params.id))
            .join(derived, 'd.landing_page', 'l.id');

        // Add search criteria, if supplied.
        if (params.keywords) {
            query.whereRaw('`l`.`value` LIKE ?', `${params.keywords}%`);
        }

        return query
            .groupBy('l.id')
            .orderBy(order, dir)
            .orderBy(order2, 'desc')
            .page(page - 1, limit)
            .then((data) => {
                for (const d of data.results) {
                    d.payout = Utils.currencyFormat(d.payout);
                    d.trans = d.trans > 999 ? Utils.numberFormat(d.trans) : String(d.trans);
                    d.raw = d.raw > 999 ? Utils.numberFormat(d.raw) : String(d.raw);
                    d.unique = d.unique > 999 ? Utils.numberFormat(d.unique) : String(d.unique);
                }

                return {
                    result_count: data.total,
                    page,
                    page_result_limit: limit,
                    start: params.start,
                    end: params.end,
                    details: data.results,
                };
            });
    }

I'm using the Model.raw() stuff in here quite a bit, but not doing anything too crazy. Not sure which usage is causing the error. I use Model.raw() in several other places in my code, but this is the only section causing a problem. Reverting to v1.2.3 gets rid of the error.

Let me know if there is anything else I can provide to help. Thanks!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions