diff options
Diffstat (limited to 'examples/ssr/server')
-rw-r--r-- | examples/ssr/server/api.mjs | 100 | ||||
-rw-r--r-- | examples/ssr/server/db.json | 28 | ||||
-rw-r--r-- | examples/ssr/server/dev-api.mjs | 17 | ||||
-rw-r--r-- | examples/ssr/server/server.mjs | 33 |
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(); } }); } |