chore: Unify backend express project into ESM (#281)
This commit is contained in:
89
entrypoint.js
Normal file
89
entrypoint.js
Normal file
@@ -0,0 +1,89 @@
|
||||
import { createServer as createHttpServer } from 'http';
|
||||
import path from 'path';
|
||||
import fs from 'fs';
|
||||
import { execSync } from 'child_process';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
|
||||
// Use express from backend node_modules
|
||||
import expressModule from './backend/node_modules/express/index.js';
|
||||
const express = expressModule.default || expressModule;
|
||||
|
||||
async function runMigrations() {
|
||||
try {
|
||||
console.log('Running database migrations...');
|
||||
// Use execSync with cwd option to run in the backend directory
|
||||
execSync('npx sequelize-cli db:migrate', {
|
||||
cwd: path.join(__dirname, 'backend'),
|
||||
stdio: 'inherit',
|
||||
});
|
||||
console.log('Database migrations completed successfully.');
|
||||
if (process.env.IS_DEMO === 'true' || process.env.IS_DEMO === '1') {
|
||||
console.log('Demo mode detected. Seeding the database...');
|
||||
execSync('npx sequelize-cli db:seed:all', {
|
||||
cwd: path.join(__dirname, 'backend'),
|
||||
stdio: 'inherit',
|
||||
});
|
||||
console.log('Database seeding completed successfully.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error running database migrations or seeding:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
async function startServer() {
|
||||
try {
|
||||
const server = express();
|
||||
const httpServer = createHttpServer(server);
|
||||
|
||||
// Import the backend app
|
||||
const backendAppModule = await import('./backend/server.js');
|
||||
const backendApp = backendAppModule.default || backendAppModule;
|
||||
server.use('/api', backendApp);
|
||||
|
||||
// For Next.js standalone build
|
||||
// Check if we have the Next.js server file
|
||||
const nextServerPath = './node_modules/next/dist/server/next.js';
|
||||
if (fs.existsSync(nextServerPath)) {
|
||||
// Import Next.js
|
||||
const nextModule = await import(nextServerPath);
|
||||
const next = nextModule.default || nextModule;
|
||||
|
||||
// Initialize Next.js app
|
||||
const dev = process.env.NODE_ENV !== 'production';
|
||||
const nextApp = next({ dev, dir: path.join(__dirname, '.') });
|
||||
const handle = nextApp.getRequestHandler();
|
||||
await nextApp.prepare();
|
||||
console.log('nextjs prepared');
|
||||
|
||||
// Use Next.js to handle all other routes
|
||||
server.all('*', (req, res) => handle(req, res));
|
||||
} else {
|
||||
console.error('Next.js module not found at:', nextServerPath);
|
||||
server.all('*', (req, res) => {
|
||||
res.status(500).send('Frontend server not available');
|
||||
});
|
||||
}
|
||||
|
||||
const PORT = process.env.PORT || 8000;
|
||||
httpServer.listen(PORT, (err) => {
|
||||
if (err) throw err;
|
||||
console.log(`> Ready on http://localhost:${PORT}`);
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Error starting server:', error);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
runMigrations()
|
||||
.then(() => {
|
||||
startServer();
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('Failed to start application:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
Reference in New Issue
Block a user