Spaces:
Sleeping
Sleeping
Create server.js
Browse files
server.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// server.js – write-access tester
|
| 2 |
+
import express from 'express';
|
| 3 |
+
import fs from 'fs';
|
| 4 |
+
import fsp from 'fs/promises';
|
| 5 |
+
import path from 'path';
|
| 6 |
+
|
| 7 |
+
const PORT = process.env.PORT || 7860;
|
| 8 |
+
const DIR = '/data'; // Space-persistent volume
|
| 9 |
+
const FILE = path.join(DIR, 'test.txt');
|
| 10 |
+
|
| 11 |
+
const app = express();
|
| 12 |
+
app.use(express.json());
|
| 13 |
+
|
| 14 |
+
/* POST /write -> attempts three save methods */
|
| 15 |
+
app.post('/write', async (_req, res) => {
|
| 16 |
+
const report = {};
|
| 17 |
+
|
| 18 |
+
// ensure /data exists
|
| 19 |
+
try {
|
| 20 |
+
fs.mkdirSync(DIR, { recursive: true });
|
| 21 |
+
report.mkdir = 'ok';
|
| 22 |
+
} catch (e) {
|
| 23 |
+
report.mkdir = e.message;
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
/* ---- Method A: sync write ---- */
|
| 27 |
+
try {
|
| 28 |
+
fs.writeFileSync(FILE, 'sync write\n', { flag: 'a' });
|
| 29 |
+
report.sync = 'ok';
|
| 30 |
+
} catch (e) {
|
| 31 |
+
report.sync = e.message;
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
/* ---- Method B: fs.promises ---- */
|
| 35 |
+
try {
|
| 36 |
+
await fsp.writeFile(FILE, 'promises write\n', { flag: 'a' });
|
| 37 |
+
report.promise = 'ok';
|
| 38 |
+
} catch (e) {
|
| 39 |
+
report.promise = e.message;
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
/* ---- Method C: stream ---- */
|
| 43 |
+
try {
|
| 44 |
+
await new Promise((resolve, reject) => {
|
| 45 |
+
const stream = fs.createWriteStream(FILE, { flags: 'a' });
|
| 46 |
+
stream.on('error', reject);
|
| 47 |
+
stream.end('stream write\n', resolve);
|
| 48 |
+
});
|
| 49 |
+
report.stream = 'ok';
|
| 50 |
+
} catch (e) {
|
| 51 |
+
report.stream = e.message;
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
res.json(report);
|
| 55 |
+
});
|
| 56 |
+
|
| 57 |
+
/* GET /read -> returns file contents or error */
|
| 58 |
+
app.get('/read', (req, res) => {
|
| 59 |
+
try {
|
| 60 |
+
const txt = fs.readFileSync(FILE, 'utf-8');
|
| 61 |
+
res.type('text/plain').send(txt);
|
| 62 |
+
} catch (e) {
|
| 63 |
+
res.status(500).send(e.message);
|
| 64 |
+
}
|
| 65 |
+
});
|
| 66 |
+
|
| 67 |
+
app.listen(PORT, '0.0.0.0', () =>
|
| 68 |
+
console.log(`📝 Write-test server listening on ${PORT} (DIR=${DIR})`)
|
| 69 |
+
);
|