Использование 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]$
Попробуйте то же самое и посмотрите, работает ли это.