diff options
Diffstat (limited to 'packages/integrations')
6 files changed, 98 insertions, 2 deletions
diff --git a/packages/integrations/node/README.md b/packages/integrations/node/README.md index 165a0733d..2464892a9 100644 --- a/packages/integrations/node/README.md +++ b/packages/integrations/node/README.md @@ -122,6 +122,25 @@ app.use(ssrHandler); app.listen({ port: 8080 }); ``` +Additionally, you can also pass in an object to be accessed with `Astro.locals` or in Astro middleware: + +```js +import express from 'express'; +import { handler as ssrHandler } from './dist/server/entry.mjs'; + +const app = express(); +app.use(express.static('dist/client/')) +app.use((req, res, next) => { + const locals = { + title: 'New title' + }; + + ssrHandler(req, res, next, locals); +); + +app.listen(8080); +``` + Note that middleware mode does not do file serving. You'll need to configure your HTTP framework to do that for you. By default the client assets are written to `./dist/client/`. ### Standalone diff --git a/packages/integrations/node/src/nodeMiddleware.ts b/packages/integrations/node/src/nodeMiddleware.ts index c0d439ba0..63ba246bd 100644 --- a/packages/integrations/node/src/nodeMiddleware.ts +++ b/packages/integrations/node/src/nodeMiddleware.ts @@ -9,14 +9,15 @@ export default function (app: NodeApp, mode: Options['mode']) { return async function ( req: IncomingMessage, res: ServerResponse, - next?: (err?: unknown) => void + next?: (err?: unknown) => void, + locals?: object ) { try { const route = mode === 'standalone' ? app.match(req, { matchNotFound: true }) : app.match(req); if (route) { try { - const response = await app.render(req); + const response = await app.render(req, route, locals); await writeWebResponse(app, res, response); } catch (err: unknown) { if (next) { diff --git a/packages/integrations/node/test/fixtures/locals/package.json b/packages/integrations/node/test/fixtures/locals/package.json new file mode 100644 index 000000000..35be7dc01 --- /dev/null +++ b/packages/integrations/node/test/fixtures/locals/package.json @@ -0,0 +1,9 @@ +{ + "name": "@test/locals", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*", + "@astrojs/node": "workspace:*" + } +} diff --git a/packages/integrations/node/test/fixtures/locals/src/pages/api.js b/packages/integrations/node/test/fixtures/locals/src/pages/api.js new file mode 100644 index 000000000..8b209c582 --- /dev/null +++ b/packages/integrations/node/test/fixtures/locals/src/pages/api.js @@ -0,0 +1,10 @@ + +export async function post({ locals }) { + let out = { ...locals }; + + return new Response(JSON.stringify(out), { + headers: { + 'Content-Type': 'application/json' + } + }); +} diff --git a/packages/integrations/node/test/fixtures/locals/src/pages/foo.astro b/packages/integrations/node/test/fixtures/locals/src/pages/foo.astro new file mode 100644 index 000000000..224a875ec --- /dev/null +++ b/packages/integrations/node/test/fixtures/locals/src/pages/foo.astro @@ -0,0 +1,4 @@ +--- +const { foo } = Astro.locals; +--- +<h1>{foo}</h1> diff --git a/packages/integrations/node/test/locals.test.js b/packages/integrations/node/test/locals.test.js new file mode 100644 index 000000000..f7fc6b73f --- /dev/null +++ b/packages/integrations/node/test/locals.test.js @@ -0,0 +1,53 @@ +import nodejs from '../dist/index.js'; +import { loadFixture, createRequestAndResponse } from './test-utils.js'; +import { expect } from 'chai'; + +describe('API routes', () => { + /** @type {import('./test-utils').Fixture} */ + let fixture; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/locals/', + output: 'server', + adapter: nodejs({ mode: 'middleware' }), + }); + await fixture.build(); + }); + + it('Can render locals in page', async () => { + const { handler } = await import('./fixtures/locals/dist/server/entry.mjs'); + let { req, res, text } = createRequestAndResponse({ + method: 'POST', + url: '/foo', + }); + + let locals = { foo: 'bar' }; + + handler(req, res, () => {}, locals); + req.send(); + + let html = await text(); + + expect(html).to.contain('<h1>bar</h1>'); + }); + + it('Can access locals in API', async () => { + const { handler } = await import('./fixtures/locals/dist/server/entry.mjs'); + let { req, res, done } = createRequestAndResponse({ + method: 'POST', + url: '/api', + }); + + let locals = { foo: 'bar' }; + + handler(req, res, () => {}, locals); + req.send(); + + let [buffer] = await done; + + let json = JSON.parse(buffer.toString('utf-8')); + + expect(json.foo).to.equal('bar'); + }); +}); |