dapr / dapr/js-sdk

Issue when express instance is shared between Dapr sever and another express application (Nest in my case)

Open
#718 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
217
Forks
104
PR merge metrics
No merged PRs in 30d

Description

## Expected Behavior

Dapr server and other application share express instance seamlessly

## Actual Behavior

Express routing all request to the other application causing Dapr server not making subscription

## Steps to Reproduce the Problem

```
import { NestFactory } from '@nestjs/core';
import { Module, Controller, Get } from '@nestjs/common';
import { DaprServer } from '@dapr/dapr';
import * as express from 'express';
import { ExpressAdapter } from '@nestjs/platform-express';

@Controller('hello')
class HelloController {
@Get()
getHello() {
return { message: 'Hello from Nest + Dapr!' };
}
}

@Module({
controllers: [HelloController],
})
class AppModule {}

async function bootstrap() {
const port = '3002';
const server = express();
const pubsubName = 'pubsub-name';
// I'using JetStream as queue
const topic1 = 'xxx.>';
const topic2 = 'yyy.>';
//
//
// Comment this and requests will only routed to Nest
server.use((req, res, next) => {
if (req.path.startsWith('/dapr') || req.path.startsWith('/events/'))
return next();
return next();
});
//
//
//
const daprServer = new DaprServer({
serverHost: 'localhost',
serverPort: port,
serverHttp: server,
clientOptions: {
daprHost: 'localhost',
daprPort: '3500',
},
});
await daprServer.pubsub.subscribe(
pubsubName,
topic1,
async (data) => console.log(topic1),
undefined,
{ rawPayload: true },
);
await daprServer.start();

const app = await NestFactory.create(AppModule, new ExpressAdapter(server));
await app.init();
}

bootstrap();

```

Run and publish to topic with and without those lines commented.

## Why is working with with middleware enabled
Before adding this middleware, some other Nest middleware or a catch-all route was intercepting POST /dapr/... or POST /events/... and returning 404.

When added this middleware, Express slightly changed the order in which middlewares/adapters were mounted. As a result, the routes registered by DaprServer ended up above Nest’s handlers and became reachable.

In other words, it’s not the actual if/else logic that fixed the problem — both branches just call next(). It only works because adding the middleware affected the mounting order, not because of the middleware’s content.

## Proposed fix
Implement documentation and notify to use an express middleware to route dapr request to Dapr server and leave others to other application

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.