First commit - V 1.0.0
This commit is contained in:
102
server.js
Normal file
102
server.js
Normal file
@@ -0,0 +1,102 @@
|
||||
require('dotenv').config();
|
||||
const express = require('express');
|
||||
const cors = require('cors');
|
||||
const { MongoClient, ObjectId } = require('mongodb');
|
||||
|
||||
const app = express();
|
||||
app.use(cors());
|
||||
app.use(express.json());
|
||||
|
||||
// Statische Dateien (z.B. global.js, CSS) ausliefern
|
||||
app.use(express.static('public'));
|
||||
|
||||
// Pug als Template Engine einrichten
|
||||
app.set('view engine', 'pug');
|
||||
app.set('views', './views');
|
||||
|
||||
const PORT = process.env.PORT || 3000;
|
||||
const MONGO_URI = process.env.MONGO_URI || 'mongodb://localhost:27017';
|
||||
const DB_NAME = process.env.DB_NAME || 'espdb';
|
||||
|
||||
let db, entriesCollection;
|
||||
|
||||
// MongoDB-Verbindung herstellen
|
||||
async function initMongo() {
|
||||
const client = new MongoClient(MONGO_URI);
|
||||
await client.connect();
|
||||
db = client.db(DB_NAME);
|
||||
entriesCollection = db.collection('entries');
|
||||
console.log(`MongoDB verbunden: ${MONGO_URI}/${DB_NAME}`);
|
||||
}
|
||||
initMongo().catch(err => {
|
||||
console.error('MongoDB Verbindungsfehler:', err);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
function formatDate(date) {
|
||||
const d = new Date(date);
|
||||
const year = d.getFullYear();
|
||||
const month = String(d.getMonth() + 1).padStart(2, '0');
|
||||
const day = String(d.getDate()).padStart(2, '0');
|
||||
return `${year}-${month}-${day}`;
|
||||
}
|
||||
|
||||
// --- Web-Seite (Pug) rendern ---
|
||||
app.get('/', (req, res) => {
|
||||
res.render('index');
|
||||
});
|
||||
|
||||
// --- API ---
|
||||
app.post('/api/save', async (req, res) => {
|
||||
const { espId, sensorNumber } = req.body;
|
||||
if (!espId || !sensorNumber) {
|
||||
return res.status(400).json({ ok: false, error: 'ESP-ID und Sensornummer sind erforderlich' });
|
||||
}
|
||||
try {
|
||||
const doc = {
|
||||
espId: String(espId).trim(),
|
||||
sensorNumber: String(sensorNumber).trim(),
|
||||
createdAt: new Date()
|
||||
};
|
||||
const result = await entriesCollection.insertOne(doc);
|
||||
return res.json({ ok: true, id: result.insertedId, entry: doc });
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
return res.status(500).json({ ok: false, error: 'DB Fehler' });
|
||||
}
|
||||
});
|
||||
|
||||
app.get('/api/list', async (req, res) => {
|
||||
const page = Math.max(1, parseInt(req.query.page) || 1);
|
||||
const limit = Math.max(1, Math.min(100, parseInt(req.query.limit) || 50));
|
||||
try {
|
||||
const total = await entriesCollection.countDocuments();
|
||||
const rawItems = await entriesCollection.find({})
|
||||
.sort({ createdAt: -1 })
|
||||
.skip((page - 1) * limit)
|
||||
.limit(limit)
|
||||
.toArray();
|
||||
const items = rawItems.map(it => ({
|
||||
...it,
|
||||
createdAt: formatDate(it.createdAt)
|
||||
}));
|
||||
return res.json({ ok: true, page, limit, total, items });
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
return res.status(500).json({ ok: false, error: 'DB Fehler' });
|
||||
}
|
||||
});
|
||||
|
||||
app.delete('/api/entry/:id', async (req, res) => {
|
||||
try {
|
||||
await entriesCollection.deleteOne({ _id: new ObjectId(req.params.id) });
|
||||
return res.json({ ok: true });
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
return res.status(500).json({ ok: false });
|
||||
}
|
||||
});
|
||||
|
||||
app.listen(PORT, () => {
|
||||
console.log(`Server läuft auf http://localhost:${PORT}`);
|
||||
});
|
||||
Reference in New Issue
Block a user