databricks-sql-nodejs icon indicating copy to clipboard operation
databricks-sql-nodejs copied to clipboard

TypeError: Cannot read properties of undefined (reading '0') using client.openSession();

Open scott16lloyd opened this issue 1 year ago • 8 comments

Previously working code causing a TypeError: Cannot read properties of undefined (reading '0'). This code is from the following example: https://github.com/databricks/databricks-sql-nodejs/blob/HEAD/examples/usage.js

const { DBSQLClient } = require('@databricks/sql');
import { DBSQLLogger, LogLevel } from '@databricks/sql';
import { NextResponse } from "next/server";



export async function POST(){

const logger = new DBSQLLogger({ filepath: 'log.txt', level: LogLevel.debug });
    
    
const client = new DBSQLClient({ logger: logger });
console.log("CREATED CLIENT");

client
  .connect({
    host: process.env.DATABRICKS_SERVER_HOSTNAME,
    path: process.env.DATABRICKS_HTTP_PATH,
    token: process.env.DATABRICKS_TOKEN,
  })
  .then(async (client: { openSession: () => any; close: () => any; }) => {
    const session = await client.openSession();
    console.log("SESSION CREATED");

    const queryOperation = await session.executeStatement('SELECT "Hello, World!"');
    const result = await queryOperation.fetchAll();
    await queryOperation.close();

    console.table(result);

    await session.close();
    await client.close();
    return NextResponse.json(result);
  })
  .catch((error: any) => {
    console.log(error);
    if (error instanceof Error) {  
        console.error("Error executing query: ", error);  
        return NextResponse.json(  
          { error: "Failed to execute query: ", details: error.message },  
          { status: 500 }  
        );  
      }  
  });
}

Console output:

{"level":"info","message":"Created DBSQLClient"}
CREATED CLIENT
TypeError: Cannot read properties of undefined (reading '0')
    at isInsideNodeModules (node:internal/util:508:17)
    at showFlaggedDeprecation (node:buffer:178:8)
    at new Buffer (node:buffer:266:3)
    at new module.exports (webpack-internal:///(rsc)/./node_modules/node-int64/Int64.js:65:34)
    at DBSQLClient.eval (webpack-internal:///(rsc)/./node_modules/@databricks/sql/dist/DBSQLClient.js:197:111)
    at Generator.next (<anonymous>)
    at eval (webpack-internal:///(rsc)/./node_modules/@databricks/sql/dist/DBSQLClient.js:31:71)
    at new Promise (<anonymous>)
    at __awaiter (webpack-internal:///(rsc)/./node_modules/@databricks/sql/dist/DBSQLClient.js:27:12)
    at DBSQLClient.openSession (webpack-internal:///(rsc)/./node_modules/@databricks/sql/dist/DBSQLClient.js:196:16)
    at eval (webpack-internal:///(rsc)/./app/api/databricks-test/route.ts:25:38)
Error executing query:  TypeError: Cannot read properties of undefined (reading '0')
    at isInsideNodeModules (node:internal/util:508:17)
    at showFlaggedDeprecation (node:buffer:178:8)
    at new Buffer (node:buffer:266:3)
    at new module.exports (webpack-internal:///(rsc)/./node_modules/node-int64/Int64.js:65:34)
    at DBSQLClient.eval (webpack-internal:///(rsc)/./node_modules/@databricks/sql/dist/DBSQLClient.js:197:111)
    at Generator.next (<anonymous>)
    at eval (webpack-internal:///(rsc)/./node_modules/@databricks/sql/dist/DBSQLClient.js:31:71)
    at new Promise (<anonymous>)
    at __awaiter (webpack-internal:///(rsc)/./node_modules/@databricks/sql/dist/DBSQLClient.js:27:12)
    at DBSQLClient.openSession (webpack-internal:///(rsc)/./node_modules/@databricks/sql/dist/DBSQLClient.js:196:16)
    at eval (webpack-internal:///(rsc)/./app/api/databricks-test/route.ts:25:38)
 ⨯ Error: No response is returned from route handler '/home/slloyd/database_ai_assistant/app/api/databricks-test/route.ts'. Ensure you return a `Response` or a `NextResponse` in all branches of your handler.
    at /home/slloyd/database_ai_assistant/node_modules/next/dist/compiled/next-server/app-route.runtime.dev.js:6:53611
    at async e_.execute (/home/slloyd/database_ai_assistant/node_modules/next/dist/compiled/next-server/app-route.runtime.dev.js:6:44747)
    at async e_.handle (/home/slloyd/database_ai_assistant/node_modules/next/dist/compiled/next-server/app-route.runtime.dev.js:6:54700)
    at async doRender (/home/slloyd/database_ai_assistant/node_modules/next/dist/server/base-server.js:1377:42)
    at async cacheEntry.responseCache.get.routeKind (/home/slloyd/database_ai_assistant/node_modules/next/dist/server/base-server.js:1599:28)
 POST /api/databricks-test 500 in 133ms

The only change made was adding:

webpack: (config) => {
       config.resolve.alias.lz4 = false;
    
       return config;
     },

to my next.config.js to prevent the following error:

Module not found: Can't resolve '../build/Release/xxhash'```

scott16lloyd avatar Aug 14 '24 14:08 scott16lloyd

Hi @scott16lloyd! Which Node version you use? Seems that your error is caused by this change to Node's utils module: nodejs/node#52147 Also, it would help if you share your devloop setup. If you're using Webpack, it may polyfill some native Nodejs APIs and sometimes break things

kravets-levko avatar Aug 14 '24 18:08 kravets-levko

Also, seems somebody already stumbled at similar error, but the code wasn't properly fixed: nodejs/node#53089

kravets-levko avatar Aug 14 '24 18:08 kravets-levko

Thank you for your reply @kravets-levko , I was running LTS version 20.16.0 so I tried 21.7.3 where I got: Error: Module did not self-register: '/home/slloyd/database_ai_assistant/node_modules/lz4/build/Release/xxhash.node'. and node:419153) [DEP0040] DeprecationWarning: The punycode module is deprecated. Please use a userland alternative instead.

so I tried the current version 22.6.0 which did run my code but there is 2 deprecation warnings:

(node:420067) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(node:420067) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead

punycode warning seems to be an issue with eslint: npm ls punycode

[email protected] /home/slloyd/project_name
└─┬ [email protected]
  └─┬ [email protected]
    └─┬ [email protected]
      └── [email protected]

and the Buffer() issue seems to link to lz4:

npm ls buffer
[email protected] /home/slloyd/project_name
└─┬ [email protected]
  └── [email protected].

I assume this is out of your control and we must wait for an update from eslint and lz4 but is it possible to create a version that will support an LTS version of Node? Or warn users that the current version must be used?

scott16lloyd avatar Aug 15 '24 09:08 scott16lloyd

@scott16lloyd Thank you for those details! I need to check if we can do anything on our side. I think upgrading eslint should be painless, and if it doesn't depend on punycode anymore - I'll do that. For Buffer warnings - new Buffer(...) is also widely used in node-int64 which is quite old and doesn't receive updates, but thrift heavily depends on it. While those are just warnings and don't disrupt your workflow - you can ignore them for now. I'll get back to you when I have any updates

kravets-levko avatar Aug 15 '24 14:08 kravets-levko

I am getting the same error on newer Node JS versions (20.16.0) But the error goes away on an earlier version (18.18.2)

edgarlcs avatar Aug 27 '24 19:08 edgarlcs

Having the same problem using Next JS 14. Any solution?

manuel-barreiro avatar Dec 16 '24 19:12 manuel-barreiro

Has anyone managed to solve this?

alangabrielbs avatar Apr 09 '25 14:04 alangabrielbs

Having the same problem using Next JS 14. Any solution?

Did you find any solution to use in nextjs?

alangabrielbs avatar Jul 08 '25 00:07 alangabrielbs