Использование Snowflake в NextJS не может подключаться или выполнять запросы в getStaticPaths/getStaticProps

Я немного повозился с NextJS и пытаюсь преобразовать приложение для предварительного рендеринга статических страниц, используя getStaticProps и getStaticPathsс файлами [id].js для каждой страницы в их собственных отдельных папках (что-то вроде pages/posts/[id].js, /pages/articles/[id visible.js и т. д.). Поскольку эти две функции гарантированно запускаются на сервере, я решил переместить функции fetch db из моего общедоступного API в эти функции напрямую. Итак, в моем [id].js файлы у меня примерно так:

getStaticProps:

export async function getStaticProps({ params }) {
    let snowflake = require('snowflake-sdk')
    require('dotenv').config();
    let result = {};
    let id = params.id;

    const connection = snowflake.createConnection( {
        account: "account",
        username: "username",
        password: "password",
        warehouse: "warehouse"
    });
    
    console.log("Connecting to Snowflake...")
    await connection.connect( <- await doesn't seem to make a difference
        function(err, conn) {
            if (err) {
                console.error('Unable to connect: ' + err.message); <- This never outputs
            } 
            else {
                console.log('Successfully connected to Snowflake.'); <- Neither does this
            }
        }
    );

    await connection.execute({ <- await doesn't seem to make a difference
        sqlText: (`select stuff
                  from my_snowflake_db
                  where id=:1`),
        binds: [id],
        complete: function(err, stmt, data) {
            if (err) {
                console.error('Failed to execute statement due to the following error: ' + err.message);
            } else {
                result = data
                result["id"] = id
            }
        }
    })

    return {
        props: {
            result
        }
    }
}

getStaticPaths:

export async function getStaticPaths() {
    let snowflake = require('snowflake-sdk')
    require('dotenv').config();
    let paths = []

    const connection = snowflake.createConnection( {
        account: "account",
        username: "username",
        password: "password",
        warehouse: "warehouse"
    });
    
    console.log("Connecting to Snowflake...")
    await connection.connect( <- await doesn't seem to make a difference
        function(err, conn) {
            if (err) {
                console.error('Unable to connect: ' + err.message); <- This never outputs
            } 
            else {
                console.log('Successfully connected to Snowflake.'); <- Neither does this
            }
        }
    );

    await connection.execute({ <- await doesn't seem to make a difference
        sqlText: (`select id
                  from my_snowflake_db
                  where ...
                  `),
        complete: function(err, stmt, rows) {
            if (err) {
                console.error('Failed to execute statement due to the following error: ' + err.message); <- Never outputs
            } else {
                console.log("Got Response!") <- Never outputs
                for (var row in rows) {
                    console.log("Found id: " + row.id)
                    paths.push({
                        params: {
                            id: row.id
                        }
                    })
                }
            }
        }
    })

    console.log("Found paths: " + JSON.stringify(paths)) <- This outputs with an empty list

    return {
        paths,
        fallback: true
    }
}

Когда я создаю приложение с помощью npm run build, все, что я получаю, это Connecting to Snowflake... и Found paths: [], то очевидно getStaticPropsпрерывается, поскольку список пуст. Я не уверен, почему не удается установить соединение или почему я даже не получаю сообщение об ошибке или успехе. Я предполагаю, что есть какая-то проблема с асинхронным подключением Snowflake, но я не понимаю, почему ключевое слово "await" в этом случае ничего не делает. Я могу добавить или удалить "ожидание", и результат будет точно таким же.

1 ответ

NextJS зависит от NodeJS, поэтому, следуя инструкциям из документации Snowflake, он заработал с первой попытки.

Это мой сценарий:

async function connectToSnowflake(){
    let snowflake = require('snowflake-sdk');
    var connection = snowflake.createConnection({
        account: 'XXXXX',
        username: 'XXXXX',
        password: 'XXXXX' })
    await connection.connect(
        function(err,conn){
            if (err) {
                console.error('Unable to connect: ' + err.message);
            } else {
                console.log('Successfully connected');
                connection_ID = conn.getId();
                console.log(connection_ID);
            }
        }
    );
    await connection.execute({
        sqlText: 'select current_database()',
        complete: function(err,stmt, rows) {
            if (err) {
                console.error('Failed to execute statement due to the following error: ' + err.message);
            } else {
                console.log('Successfully executed statement: ' + stmt.getSqlText());
            }
        }
    });
}
connectToSnowflake();

Запустив этот скрипт, я получаю:

[local@fedora nodejs]$ node connect_snowflake.js 
Successfully connected
90dfc5b0-a509-4d0a-8cfb-8022d02e8603
Successfully executed statement: select current_database()
[local@fedora nodejs]$ 

Попробуйте то же самое и посмотрите, работает ли это.

Другие вопросы по тегам