0

I have deployed two services on Container Apps, both setup using Fastify, both with Dapr enabled.

I cannot seem to get the POST requests between the two services working. If Service A make a POST request with a request body to Service B, the request.body turns out to be an empty string in Service B.

However, if I invoke the POST route of Service B directly on Postman with a JSON request body. It works fine.

I cannot figure the reason why.

My dapr version is:

CLI version: 1.13.0 Runtime version: 1.13.5

And advice is appreciated !

Expected Behavior

Services can invoke POST requests between them and can pass the request body from the caller service to the receiver service.

Actual Behavior

The Expense Service tries to call the Notification Service. It works fine locally. But after deployed to Azure Container Apps, the request body is an empty string.

// expense service

import Fastify from "fastify";
import fetch from "node-fetch";

const fastify = Fastify({
  logger: true,
});

const DAPR_HOST = process.env.DAPR_HOST || "http://localhost";
const DAPR_HTTP_PORT = process.env.DAPR_HTTP_PORT || "3500";

fastify.post("/expense/new", async function handler(request, reply) {
  try {
    const { body } = request;

    const resp = await fetch(`${DAPR_HOST}:${DAPR_HTTP_PORT}/test`, {
      method: "POST",
      headers: {
        "dapr-app-id": "notification-service",
        "content-type": "application/json",
      },
      body: JSON.stringify(body),
    });

    const data = await resp.json();
    reply.send(data);
  } catch (err: any) {
    console.error(err);
    reply.code(500).send({ error: err.message });
  }
});

try {
  await fastify.listen({ host: "0.0.0.0", port: 3000 });
} catch (err) {
  fastify.log.error(err);
  process.exit(1);
}
// notification service

import Fastify from "fastify";

const fastify = Fastify({
  logger: true,
});

fastify.addContentTypeParser(
  "application/json",
  { parseAs: "string" },
  function (req, body: any, done) {
    try {
      // console.log("RAW: ", body);
      console.log("wtf");
      done(null, body);
    } catch (err: any) {
      err.statusCode = 400;
      done(err, undefined);
    }
  }
);

fastify.post("/test", async function handler(request, reply) {
  console.log(request.body); // <-- this is an empty string on Azure Container Apps, but works fine locally
  reply.send({ body: request.body });
});

try {
  await fastify.listen({ host: "0.0.0.0", port: 3001 });
} catch (err) {
  fastify.log.error(err);
  process.exit(1);
}

I tried using the dapr CDK clients and server but they resulted in the same problem.

1 Answer 1

0

I tried with your sample code below using fastify and isomorphic-fetch packages and it did not display any request response after post request below as show in the image.

fastify.post('/neworder', async (request, reply) => {
  const { orderId, ...data } = request.body;

  const state = [{
    key: "order",
    value: { orderId, ...data }
  }];

  try {
    const response = await fetch(stateUrl, {
      method: "POST",
      body: JSON.stringify(state),
      headers: {
        "Content-Type": "application/json"
      }
    });
    if (!response.ok) {
      throw new Error("Failed to persist state.");
    }
    fastify.log.info(`Successfully persisted state for Order ID: ${orderId}`);
    reply.status(200).send();
  } catch (error) {
    fastify.log.error(error);
    reply.status(500).send({ message: error.message });
  }
});

enter image description here

To include the request body in the response for the POST /neworder endpoint, you can modify the route handler to include the request body in the response after successfully saving the state. Here's an updated version of your code with this change:

  • After saving the state, the POST /neworder route now includes the request body in the response.
  • The reply.status(200).send({...}) call sends a response containing a success message and the original request body. Added logging of the request body using fastify.log.info for debugging purposes.

fastify.post('/neworder', async (request, reply) => {
  const { orderId, ...data } = request.body;

  if (!orderId) {
    reply.status(400).send({ message: 'Order ID is required.' });
    return;
  }

  const state = [{
    key: "order",
    value: { orderId, ...data }
  }];

  try {
    const response = await fetch(stateUrl, {
      method: "POST",
      body: JSON.stringify(state),
      headers: {
        "Content-Type": "application/json"
      }
    });
    if (!response.ok) {
      throw new Error("Failed to persist state.");
    }

    // Log the request body for debugging purposes
    fastify.log.info(`Successfully persisted state for Order ID: ${orderId}`, { requestBody: request.body });

    // Send the request body in the response
    reply.status(200).send({
      message: `Order ID ${orderId} has been saved.`,
      requestBody: request.body
    });
  } catch (error) {
    fastify.log.error(error);
    reply.status(500).send({ message: error.message });
  }
});

The command you provided is used to run a Node.js application with Dapr

dapr run --app-id nodeapp --app-port 3000 --dapr-http-port 3500 --dapr-grpc-port 50001 -- node app.mjs/app.js

enter image description here

This way, when you make a POST request to /neworder, you'll get a response with the message confirming the order ID has been saved and the details of the order that was sent in the request body. enter image description here

enter image description here enter image description here

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for your reply. But my issue is more about sending a request body between Service A and Service B. At the moment when Service A sends a POST request to Service B, the request body seems to be empty when it reaches Service B. However, if I invoke Service B directly, it is working fine.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.