summaryrefslogtreecommitdiff
path: root/examples/ssr/server
diff options
context:
space:
mode:
Diffstat (limited to 'examples/ssr/server')
-rw-r--r--examples/ssr/server/api.mjs100
-rw-r--r--examples/ssr/server/db.json28
-rw-r--r--examples/ssr/server/dev-api.mjs17
-rw-r--r--examples/ssr/server/server.mjs33
4 files changed, 16 insertions, 162 deletions
diff --git a/examples/ssr/server/api.mjs b/examples/ssr/server/api.mjs
deleted file mode 100644
index 589766ee9..000000000
--- a/examples/ssr/server/api.mjs
+++ /dev/null
@@ -1,100 +0,0 @@
-import fs from 'fs';
-import lightcookie from 'lightcookie';
-
-const dbJSON = fs.readFileSync(new URL('./db.json', import.meta.url));
-const db = JSON.parse(dbJSON);
-const products = db.products;
-const productMap = new Map(products.map((product) => [product.id, product]));
-
-// Normally this would be in a database.
-const userCartItems = new Map();
-
-const routes = [
- {
- match: /\/api\/products\/([0-9])+/,
- async handle(_req, res, [, idStr]) {
- const id = Number(idStr);
- if (productMap.has(id)) {
- const product = productMap.get(id);
- res.writeHead(200, {
- 'Content-Type': 'application/json',
- });
- res.end(JSON.stringify(product));
- } else {
- res.writeHead(404, {
- 'Content-Type': 'text/plain',
- });
- res.end('Not found');
- }
- },
- },
- {
- match: /\/api\/products/,
- async handle(_req, res) {
- res.writeHead(200, {
- 'Content-Type': 'application/json',
- });
- res.end(JSON.stringify(products));
- },
- },
- {
- match: /\/api\/cart/,
- async handle(req, res) {
- res.writeHead(200, {
- 'Content-Type': 'application/json',
- });
- let cookie = req.headers.cookie;
- let userId = cookie ? lightcookie.parse(cookie)['user-id'] : '1'; // default for testing
- if (!userId || !userCartItems.has(userId)) {
- res.end(JSON.stringify({ items: [] }));
- return;
- }
- let items = userCartItems.get(userId);
- let array = Array.from(items.values());
- res.end(JSON.stringify({ items: array }));
- },
- },
- {
- match: /\/api\/add-to-cart/,
- async handle(req, res) {
- let body = '';
- req.on('data', (chunk) => (body += chunk));
- return new Promise((resolve) => {
- req.on('end', () => {
- let cookie = req.headers.cookie;
- let userId = lightcookie.parse(cookie)['user-id'];
- let msg = JSON.parse(body);
-
- if (!userCartItems.has(userId)) {
- userCartItems.set(userId, new Map());
- }
-
- let cart = userCartItems.get(userId);
- if (cart.has(msg.id)) {
- cart.get(msg.id).count++;
- } else {
- cart.set(msg.id, { id: msg.id, name: msg.name, count: 1 });
- }
-
- res.writeHead(200, {
- 'Content-Type': 'application/json',
- });
- res.end(JSON.stringify({ ok: true }));
- });
- });
- },
- },
-];
-
-export async function apiHandler(req, res) {
- for (const route of routes) {
- const match = route.match.exec(req.url);
- if (match) {
- return route.handle(req, res, match);
- }
- }
- res.writeHead(404, {
- 'Content-Type': 'text/plain',
- });
- res.end('Not found');
-}
diff --git a/examples/ssr/server/db.json b/examples/ssr/server/db.json
deleted file mode 100644
index 76f9e4da3..000000000
--- a/examples/ssr/server/db.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "products": [
- {
- "id": 1,
- "name": "Cereal",
- "price": 3.99,
- "image": "/images/products/cereal.jpg"
- },
- {
- "id": 2,
- "name": "Yogurt",
- "price": 3.97,
- "image": "/images/products/yogurt.jpg"
- },
- {
- "id": 3,
- "name": "Rolled Oats",
- "price": 2.89,
- "image": "/images/products/oats.jpg"
- },
- {
- "id": 4,
- "name": "Muffins",
- "price": 4.39,
- "image": "/images/products/muffins.jpg"
- }
- ]
-}
diff --git a/examples/ssr/server/dev-api.mjs b/examples/ssr/server/dev-api.mjs
deleted file mode 100644
index 305ac609b..000000000
--- a/examples/ssr/server/dev-api.mjs
+++ /dev/null
@@ -1,17 +0,0 @@
-import { createServer } from 'http';
-import { apiHandler } from './api.mjs';
-
-const PORT = process.env.PORT || 8085;
-
-const server = createServer((req, res) => {
- apiHandler(req, res).catch((err) => {
- console.error(err);
- res.writeHead(500, {
- 'Content-Type': 'text/plain',
- });
- res.end(err.toString());
- });
-});
-
-server.listen(PORT);
-console.log(`API running at http://localhost:${PORT}`);
diff --git a/examples/ssr/server/server.mjs b/examples/ssr/server/server.mjs
index bed49b749..9838d7ada 100644
--- a/examples/ssr/server/server.mjs
+++ b/examples/ssr/server/server.mjs
@@ -1,29 +1,28 @@
import { createServer } from 'http';
import fs from 'fs';
import mime from 'mime';
-import { apiHandler } from './api.mjs';
import { handler as ssrHandler } from '../dist/server/entry.mjs';
const clientRoot = new URL('../dist/client/', import.meta.url);
async function handle(req, res) {
- ssrHandler(req, res, async () => {
- // Did not match an SSR route
+ ssrHandler(req, res, async (err) => {
+ if(err) {
+ res.writeHead(500);
+ res.end(err.stack)
+ return;
+ }
- if (/^\/api\//.test(req.url)) {
- return apiHandler(req, res);
- } else {
- let local = new URL('.' + req.url, clientRoot);
- try {
- const data = await fs.promises.readFile(local);
- res.writeHead(200, {
- 'Content-Type': mime.getType(req.url),
- });
- res.end(data);
- } catch {
- res.writeHead(404);
- res.end();
- }
+ let local = new URL('.' + req.url, clientRoot);
+ try {
+ const data = await fs.promises.readFile(local);
+ res.writeHead(200, {
+ 'Content-Type': mime.getType(req.url),
+ });
+ res.end(data);
+ } catch {
+ res.writeHead(404);
+ res.end();
}
});
}