next-server-root-dir
v0.0.1
Published
This package is to get the physical path of *server* directory of a nextjs application. It's useful when we want to place a file and then read it at *run-time*.
Downloads
13
Readme
next-server-root-dir
This package is to get the physical path of server directory of a nextjs application. It's useful when we want to place a file and then read it at run-time.
Nextjs uses Webpack as the bundler. The bundler packs some source code files to be one file that will change the original directory
structure of the project. The problem will occur, specifically, when we use SQLite database. The path of the database file must be
determined at run-time. We can't use __dirname
variable because the directory structure has changed.
Let's take an example of how to use this package. Consider, we place connect-sqlite.ts
and sqlite.db
file under src/data
directory in our project. We must place sqlite.db
(the database file) in a known path after bundling so that the application
can open the file. The database file path should be relative to server directory. In this example we place it in server/data
directory.
First, we must instruct Webpack to save the database file at the right place. In next.cofig.js
, insert the below config:
webpack: (config, {dev, isServer}) => {
if (isServer) {
config.module.rules.push(
{
test: /data(\/|\\)sqlite\.db$/,
loader: "file-loader",
options: {
name: dev ? 'data/sqlite.db' : '../data/sqlite.db',
}
},
);
}
return config;
},
We must also install file-loader
package (npm i file-loader --save-dev
).
In connect-sqlite.ts
file:
import sqlite from 'sqlite3';
import {getRootPath} from 'next-server-root-dir';
import './sqlite.db'; //instructs Webpack to bundle db file
const serverRoot = getRootPath();
const dbPath = serverRoot ? `${serverRoot}/data/sqlite.db` : `${__dirname}/sqlite.db`;
let db: sqlite.Database | undefined;
export async function getDb() {
if (!db) {
db = await new Promise((resolve, reject) => {
const _db = new sqlite.Database(
dbPath,
sqlite.OPEN_READONLY,
err => {
if (err) reject(err);
else resolve(_db);
}
);
});
}
return db;
}
getRootPath
function will return null
if it cannot find server directory.