server implementation for poster generation
This commit is contained in:
82
server/movie_posters/lib/index.js
Normal file
82
server/movie_posters/lib/index.js
Normal file
@@ -0,0 +1,82 @@
|
||||
import { poster } from './poster.js';
|
||||
import { start as startProfiler } from '@google-cloud/profiler'; // Renamed import for clarity
|
||||
import cors from 'cors';
|
||||
import express from 'express';
|
||||
|
||||
// --- Configuration ---
|
||||
const PORT = process.env.PORT || 3000;
|
||||
// Enable profiler, e.g., only in production environments
|
||||
const PROFILER_ENABLED = process.env.ENABLE_PROFILER === 'true' || process.env.NODE_ENV === 'production';
|
||||
const SERVICE_NAME = 'movie_posters';
|
||||
const SERVICE_VERSION = '1.0.0'; // Consider reading from package.json
|
||||
|
||||
// --- Application Setup ---
|
||||
const app = express();
|
||||
|
||||
// --- Google Cloud Profiler Setup ---
|
||||
if (PROFILER_ENABLED) {
|
||||
startProfiler({
|
||||
projectId: process.env.PROJECT_ID, // Ensure PROJECT_ID is set in the environment
|
||||
serviceContext: {
|
||||
service: SERVICE_NAME,
|
||||
version: SERVICE_VERSION,
|
||||
},
|
||||
}).then(() => {
|
||||
console.log(`Google Cloud Profiler started for service ${SERVICE_NAME} v${SERVICE_VERSION}.`);
|
||||
}).catch(err => {
|
||||
// Log the error but don't prevent the app from starting
|
||||
console.error('Failed to start Google Cloud Profiler:', err);
|
||||
});
|
||||
} else {
|
||||
console.log('Google Cloud Profiler is disabled.');
|
||||
}
|
||||
|
||||
// --- Core Middleware ---
|
||||
app.use(cors()); // Enable Cross-Origin Resource Sharing for all origins
|
||||
app.use(express.json()); // Parse incoming JSON request bodies
|
||||
|
||||
// --- Specific Error Handling Middleware ---
|
||||
// Handles JSON parsing errors specifically, providing a clearer error message.
|
||||
app.use((err, req, res, next) => {
|
||||
// Check if the error is a syntax error thrown by express.json()
|
||||
if (err instanceof SyntaxError && err.status === 400 && 'body' in err) {
|
||||
console.error('Bad JSON format received:', err.message);
|
||||
return res.status(400).send({ error: 'Invalid JSON format in request body.' });
|
||||
}
|
||||
// Pass other errors down the middleware chain
|
||||
next(err);
|
||||
});
|
||||
|
||||
app.use('/poster', poster.router);
|
||||
|
||||
// --- Routes ---
|
||||
|
||||
// Root GET endpoint: Provides basic API status information.
|
||||
app.get("/", (req, res) => {
|
||||
res.status(200).send({
|
||||
status: 'API is running.',
|
||||
message: 'Use the POST /poster endpoint with a JSON body to generate posters.',
|
||||
service: SERVICE_NAME,
|
||||
version: SERVICE_VERSION
|
||||
});
|
||||
});
|
||||
|
||||
// --- Generic Error Handler ---
|
||||
// Catches any errors passed via `next(err)` from preceding middleware or routes.
|
||||
// This should be the last middleware added.
|
||||
app.use((err, req, res, next) => {
|
||||
console.error("Unhandled application error:", err);
|
||||
// Ensure response is sent only once
|
||||
if (!res.headersSent) {
|
||||
res.status(500).send({ error: 'An internal server error occurred.' });
|
||||
}
|
||||
});
|
||||
|
||||
// --- Server Start ---
|
||||
app.listen(PORT, () => {
|
||||
console.log(`Server listening on port ${PORT}`);
|
||||
console.log(`Access the API at http://localhost:${PORT}`);
|
||||
if (PROFILER_ENABLED) {
|
||||
console.log(`Google Cloud Profiler is active for project: ${process.env.PROJECT_ID || 'Not Specified'}`);
|
||||
}
|
||||
});
|
Reference in New Issue
Block a user