2

I'm using Node and Express, hosting in Firebase Functions to build an API to persist the data.

When I send a JSON object to a router, the parser works ok, but when I have Dates, they are parsed as string, causing some trouble to save the data correctly.

I discovered the body parser could help me, as it includes a reviver function to JSON.parse when parsing the request body.

In my index.ts I have:

const app = express();
const main = express();

app.use('/', indexRouter);
app.use('/mail', mailRouter);
// ... more routes

main.use(cors());
main.use(bodyParser.urlencoded({ extended: true }));
main.use(bodyParser.json({
    reviver: (key, value) => {
        if (typeof value === "string") {
            const valueDate = new Date(value).getTime();

            if(!isNaN(valueDate)){
                return new Date(value);
            }
        }

        return value;
    }
}));
main.use('/v1', app);

export const api = functions.https.onRequest(main);

In the visit.ts router I have:

import express from 'express';
import Visit from '../models/visit';

const router = express.Router();

router.post('/', async (req, res) => {
    const visit = <Visit>req.body;
    console.log('Is date: `, visit.date instanceof Date)
});

export default router;

It seems the reviver is never called (if I put just a console.log, it's never showed up)

Am I missing some detail? The order of middlewares in index.ts is wrong? I've got no clue :(

PS: I'm testing using Postman, putting the header Content-Type as application/json. In the application I am using the fetch function using the same header.

Victor de Almeida
  • 990
  • 2
  • 7
  • 7
  • I tried multiple ways to get reviver function to work with express json to no avail. I think express json reviver option simply does not work at all. – Riad Baghbanli Jul 01 '23 at 01:18

0 Answers0