summaryrefslogtreecommitdiff
path: root/packages/integrations
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations')
-rw-r--r--packages/integrations/node/README.md19
-rw-r--r--packages/integrations/node/src/nodeMiddleware.ts5
-rw-r--r--packages/integrations/node/test/fixtures/locals/package.json9
-rw-r--r--packages/integrations/node/test/fixtures/locals/src/pages/api.js10
-rw-r--r--packages/integrations/node/test/fixtures/locals/src/pages/foo.astro4
-rw-r--r--packages/integrations/node/test/locals.test.js53
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');
+ });
+});