Gingee executes your backend logic using JavaScript files that live inside your app's secure box
folder. For consistency and ease of use, all executable scripts—whether they are handling a live API request, acting as middleware, or performing a one-time setup task—share the same fundamental structure. This guide explains the three types of scripts and the powerful $g
object that connects them.
All Gingee scripts, regardless of their purpose, follow this simple and mandatory pattern:
// A script must export a single asynchronous function.
module.exports = async function() {
// The entire logic is wrapped in a call to the global 'gingee()' function.
await gingee(async function($g) {
// Your application code goes here.
// You use the '$g' object to interact with the world.
});
};
This unified structure ensures that every piece of executable code runs within the same secure, sandboxed environment and receives a properly configured context object ($g
).
While the structure is the same, the purpose of a script and the context it runs in can differ. There are three types of scripts you can create.
This is the most common type of script. It runs in direct response to an incoming HTTP request from a browser or client.
routes.json
.$g
Context: Has access to the full $g
object, including:
$g.request
: To get headers, query parameters, and the request body.$g.response
: To send a response back to the client.$g.log
and $g.app
.Example (box/api/users/get.js
):
module.exports = async function() {
await gingee(async ($g) => {
const userId = $g.request.query.id;
// ... logic to fetch user from database ...
$g.response.send({ id: userId, name: 'Alex' });
});
};
These scripts run before every Server Script in your application. They act as middleware.
app.json
via the "default_include"
array. They run in the order they are listed, before the final Server Script is executed.$g
Context: Has access to the full $g
object, just like a Server Script. A key feature is that if a Default Include script uses $g.response.send()
, the request lifecycle is immediately terminated, and no further scripts (including the main Server Script) will be executed.Example (box/auth_middleware.js
):
module.exports = async function() {
await gingee(async ($g) => {
const token = $g.request.headers['x-auth-token'];
if (!isValid(token)) {
// This ends the request immediately.
$g.response.send({ error: 'Unauthorized' }, 401);
}
// If we don't send a response, execution continues to the next script.
});
};
These scripts run once when your application is loaded by the server. They are not tied to any HTTP request.
app.json
via the "startup-scripts"
array. They run in the order they are listed when the Gingee server starts, when an app is newly installed, or after an app is upgraded or rolled back.$g
Context: Receives a specialized, non-HTTP version of the $g
object.
$g.log
, $g.app
.$g.request
and $g.response
are null
, as there is no incoming request or outgoing response.Example (box/setup/create_schema.js
):
module.exports = async function() {
await gingee(async ($g) => {
const db = require('db');
$g.log.info('Checking for Users table...');
const sql = 'CREATE TABLE IF NOT EXISTS "Users" (id SERIAL PRIMARY KEY, email TEXT)';
await db.execute('main_db', sql);
$g.log.info('Database schema is ready.');
});
};
$g
Object: Full API ReferenceThe $g
object is the heart of the server script API. It provides a simplified and secure facade for interacting with the HTTP request, building a response, logging, and accessing application configuration.
$g.request
An object containing all the details of the incoming HTTP request.
$g.request.url
URL
object$g.request.protocol
string
'http'
or 'https'
.$g.request.hostname
string
Host
header (e.g., 'localhost:7070'
).$g.request.method
string
'GET'
, 'POST'
, 'PUT'
).$g.request.path
string
'/users/list'
).$g.request.headers
object
$g.request.headers['user-agent']
).$g.request.cookies
object
$g.request.query
object
$g.request.params
object
routes.json
.path: "/users/:userId/posts/:postId"
and a request to /users/123/posts/abc
, $g.request.params
would be { "userId": "123", "postId": "abc" }
.$g.request.body
object
| string
| null
gingee()
middleware automatically parses the body based on the Content-Type
header.
application/json
: An object.application/x-www-form-urlencoded
: An object.multipart/form-data
: An object containing text fields and a files
object. Each file in files
includes its name
, type
, size
, and its content as a Buffer
in the data
property.null
.$g.response
An object used to build the outgoing HTTP response. You modify its properties and then call $g.response.send()
to send it.
$g.response.status
number
200
send()
.$g.response.status = 404;
$g.response.headers
object
{ 'Content-Type': 'text/plain' }
$g.response.cookies
object
send()
method will format these into Set-Cookie
headers.HttpOnly
, maxAge
), use the cookie
module. This is a shortcut for simple key-value cookies.$g.response.body
any
null
send()
method.$g.response.send(data, [status], [contentType])
data
: The content to send.
string
or Buffer
, it's sent as-is.object
or Array
, it is automatically JSON.stringify()
-ed, and the Content-Type
is set to application/json
.status
(optional): A number
to set the HTTP status code, overriding $g.response.status
.contentType
(optional): A string
to set the Content-Type
header, overriding $g.response.headers['Content-Type']
.$g.response.send({ user: 'test' });
$g.response.send(imageBuffer, 200, 'image/png');
$g.log
A direct reference to the apps's logger instance, pre-configured with the request's context.
$g.log.info(message, [meta])
$g.log.warn(message, [meta])
$g.log.error(message, [meta])
message
is a string, and the optional meta
object can contain any additional data you want to log (like a user ID or a full error stack).$g.app
An object containing safe, read-only configuration data for the current application.
$g.app.name
: (string) The app's display name from app.json
.$g.app.version
: (string) The app's version from app.json
.$g.app.description
: (string) The app's description from app.json
.$g.app.env
: (object) The custom environment variables defined in the env
block of app.json
.NOTE: The $g object will not have the $g.request and $g.response objects for a startup script.