# Από το Express στο Total.js 5

> Τι γράφετε στο Express και τι γράφεστε στο Total.js 5 για την ίδια δουλειά: διαδρομές, παραμέτρους, σώματα, απαντήσεις, μεσαία λογισμικά, στατικά αρχεία, cookies, επικύρωση, προβολές και πολλά άλλα.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: el
Content-SHA256: a88960dd5bf4173d3f005996d9e9512f83017d5c4e85e4edd04c4192009469ec
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Το Total.js δεν είναι Express με άλλο όνομα. Οι μεγαλύτερες διαφορές: ένας χειριστής λαμβάνει **ένα μόνο αντικείμενο, το `$`**, αντί για `(req, res)`· το σώμα αναλύεται από το framework ανάλογα με τον τύπο περιεχομένου του· δεν εγκαθιστάτε πακέτα για cookies, μεταφορτώσεις, επικύρωση, συνεδρίες, CORS, cron ή email, επειδή είναι μέρος του framework· και τα αρχεία του έργου σας **φορτώνονται από φακέλους** αντί να εισάγονται (δείτε τη σελίδα για τη δομή του έργου).

Οι πίνακες συνδυάζουν κοινά πρότυπα Express με τα ισοδύναμα Total.js τους 5.

| Εργασία | Express | Total.js 5 |
|---|---|---|
| Εκκίνηση του διακομιστή | `app.listen(3000)` | `Total.run({ port: 3000 })` |
| Μια διαδρομή | `app.get('/users', fn)` | `ROUTE('GET /users/', fn)` (γράψτε την τελική κάθετο) |
| Παράμετρος διαδρομής | `app.get('/users/:id', fn)` και `req.params.id` | `ROUTE('GET /users/{id}/', fn)` και `$.params.id` |
| Συμβολοσειρά ερωτήματος | `req.query.page` | `$.query.page` |
| Σώμα JSON | `app.use(express.json())` και `req.body` | `$.body`, αναλύεται ανάλογα με τον τύπο περιεχομένου |
| Κεφαλίδες αιτήματος | `req.headers['x-token']` | `$.headers['x-token']` |
| Αποστολή JSON | `res.json(object)` | `$.json(object)` |
| Αποστολή κειμένου ή HTML | `res.send('text')` | `$.plain('text')` ή `$.html('<p>..</p>')` |
| Κωδικός κατάστασης | `res.status(404).json(...)` | `$.invalid(404)` για σφάλμα, ή `$.response.status = 201` πριν απαντήσετε |
| Κεφαλίδα απάντησης | `res.set('x-a', 'b')` | `$.response.headers['x-a'] = 'b'` |
| Ανακατεύθυνση | `res.redirect('/x')` | `$.redirect('/x')` |
| Cookies | `cookie-parser`, `res.cookie(...)` | `$.cookie('name')` για ανάγνωση, `$.cookie('name', value, '1 day')` για εγγραφή |
| Middleware σε μια διαδρομή | `app.get('/a', mw, fn)` | `MIDDLEWARE('mw', ($, next) => ...)` και `ROUTE('GET /a/ #mw', fn)` |
| Στατικά αρχεία | `app.use(express.static('public'))` | Βάλτε τα αρχεία στο `public/`: χωρίς κώδικα |
| Λήψη αρχείου | `res.download(path, name)` | `$.file(path, name)` |
| Πρότυπο | `res.render('page', model)` | `$.view('page', model)` |
| Επικύρωση εισόδου | `express-validator` ή `zod` | `input: '*email:Email, age:Number'` σε μια ενέργεια |
| Σελίδα σφάλματος | ένα middleware χειρισμού σφαλμάτων | `ROUTE('#404', fn)` και `ROUTE('#401', fn)` |
| Πιστοποίηση | `passport` ή `express-session` | `AUTH(fn)` και `ROUTE('+GET /private/', fn)` |
| Μεταφορτώσεις | `multer` | η σημαία `@upload` και `$.files` |
| CORS | `cors` | `CORS('https://example.com')` |
| Κλήση άλλου API | `axios` ή `fetch` | `REQUEST()` και `RESTBuilder` |
| Προγραμματισμένες εργασίες | `node-cron` | `CRON('0 9 * * 1-5', fn)` |
| Αποστολή email | `nodemailer` | `MAIL()` και `HTMLMAIL()` με `mail_smtp` στο `config` |
| WebSocket | `ws` ή `socket.io` | `ROUTE('SOCKET /chat/', fn)` |

Κάθε μέρος έχει μια συνταγή με περισσότερες λεπτομέρειες· αυτή είναι ολόκληρη η αντιστοίχιση σε ένα σημείο. Το παράδειγμα παρακάτω είναι η πλευρά του Total.js των γραμμών που χρειάζονται κώδικα.

```js definitions/compare.js
MIDDLEWARE('mw', function($, next) {
	$.response.headers['x-a'] = 'b';
	next();
});

NEWACTION('Users/create', {
	name: 'Create a user',
	input: '*email:Email, age:Number',
	action: function($, model) {
		$.callback({ email: model.email, age: model.age });
	}
});
```

```js controllers/compare.js
exports.install = function() {
	ROUTE('GET /users/{id}/', user);
	ROUTE('POST /users/ --> *Users/create');
	ROUTE('GET /mw/ #mw', ok);
	ROUTE('GET /created/', created);
	ROUTE('GET /moved/', moved);
	ROUTE('GET /cookie/', cookie);
	ROUTE('GET /html/', html);
};

function user($) {
	$.json({ id: $.params.id, page: $.query.page, token: $.headers['x-token'] });
}

function ok($) {
	$.json({ ok: true });
}

function created($) {
	$.response.status = 201;
	$.json({ created: true });
}

function moved($) {
	$.redirect('/users/1/');
}

function cookie($) {
	$.cookie('visited', 'yes', '1 day');
	$.json({ before: $.cookie('visited') || null });
}

function html($) {
	$.html('<p>Hello</p>');
}
```
