NextJS - hpaluch/hpaluch.github.io GitHub Wiki

Notes on React/NextJS tutorial

I'm currently following: https://nextjs.org/learn

Here are my notes how to use it on Fedora 41.

Install NodeJS and openssl command (needed for .local.env setup later) using:

sudo dnf install nodejs openssl

Issues

When there is custom Error the next.js error handler will crash with Error: [object Object] instead of reporting real error. See https://github.com/vercel/next.js/issues/31670

I found nice tip from https://github.com/vercel/storage/issues/123#issuecomment-2135886902

  • replace const client = await db.connect();
  • with:
const client = await db.connect(
 ((err) => {
    if (err) {
      console.error(err);
    }
  })
);

Local PostgreSQL

Using local Postgres database:

# contrib is required for extension/uuid-ossp.control
sudo dnf install postgresql-server postgresql-contrib
sudo /usr/bin/postgresql-setup --initdb
sudo systemctl enable --now postgresql

I recommend to add following rule to /etc/sudoers to avoid entering password while changing identity to postgres user for all users in group wheel:

%wheel	ALL=(postgres)	NOPASSWD: ALL

You can now try as your user (as long as it is in wheel group) directly:

# to list databases
sudo -u postgres psql -l

Not I use local user named aa and used these SQL commands to setup database, user and schemas:

CREATE DATABASE aa OWNER aa;
-- https://medium.com/@prabhathsumindapathirana/getting-started-with-postgres-setting-up-a-user-schema-and-grants-bbb2a3f536df
CREATE SCHEMA reactjs;
create user aa with encrypted password 'Admin123';
-- FIXME these are probably no longer needed:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA reactjs TO aa;
GRANT USAGE ON SCHEMA reactjs TO aa;
alter user aa set search_path=reactjs, "$user", public;

You have to enter above SQL commands as postgres privileged user using sudo -u postgres psql -f file.sql

Now you can directly run psql -l as user aa - it will use Unix socket and UID authentication.

To be able to login via TCP socket you need to edit /var/lib/pgsql/data/pg_hba.conf and change ident to md5 on these lines:

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

Now you can test database connection via TCP socket on localhost:

psql -h 127.0.0.1 -U aa -d aa -l
# enter "Admin123" as password

We have to also build wsproxy from https://github.com/neondatabase/wsproxy (I don't like to install Docker to run just single statically linked Go binary!):

mkdir -p ~/projects
cd ~/projects
git clone https://github.com/neondatabase/wsproxy.git
cd wsproxy/
sudo dnf install golang-bin
go mod download -x
go build
mkdir -p ~/bin
cp wsproxy ~/bin

You can run wsproxy using:

LISTEN_PORT=':54330' ALLOW_ADDR_REGEX='.*' APPEND_PORT='localhost:5432' LOG_TRAFFIC=true ~/bin/wsproxy

Create .env.local with:

POSTGRES_URL=postgresql://aa:Admin123@localhost:5432/aa

Follow tutorial https://nextjs.org/learn/dashboard-app/setting-up-your-database but may some modifications at header of app/seed/route.ts (adapted from https://github.com/vercel/storage/issues/123):

import bcrypt from 'bcrypt';
import { neonConfig } from '@neondatabase/serverless';
import { db, createClient } from '@vercel/postgres';
import { invoices, customers, revenue, users } from '../lib/placeholder-data';

const client = createClient(
        { connectionString: process.env.POSTGRES_URL, }
);    
client.neonConfig.wsProxy = (host) => `${host}:54330/v1`;
client.neonConfig.useSecureWebSocket = false;
client.neonConfig.pipelineTLS = false;
client.neonConfig.pipelineConnect = false;
     
await client.connect(
 ((err) => {
    if (err) {
      console.error(err);
    }
  })
); 

// replace code up to:
//    const client = await db.connect();
// remaining coda is unchanged...

After reload you may get error:

{
  "error": {
    "length": 310,
    "name": "error",
    "severity": "ERROR",
    "code": "0A000",
    "detail": "Could not open extension control file \"/usr/share/pgsql/extension/uuid-ossp.control\": No such file or directory.",
    "hint": "The extension must first be installed on the system where PostgreSQL is running.",
    "file": "extension.c",
    "line": "504",
    "routine": "parse_extension_control_file"
  }
}

It should be fixed with:

sudo dnf install postgresql-contrib
sudo systemctl restart postgresql

After accessing http://localhost:3000/seed again they should be message:

{"message":"Database seeded successfully"}

And you can verify as user aa that there are new tables:

$ psql -c '\dt'

         List of relations
 Schema |   Name    | Type  | Owner 
--------+-----------+-------+-------
 public | customers | table | aa
 public | invoices  | table | aa
 public | revenue   | table | aa
 public | users     | table | aa
(4 rows)

And you can continue on https://nextjs.org/learn/dashboard-app/fetching-data