I'm creating a CronJob that calls an API and store its response in the database:
const CronJob = require("cron").CronJob;
const btc_price_ticker = require("../../controllers/BtcExchange/Ticker");
const currency = require("../../controllers/Currencies/CurrenciesController");
module.exports = new CronJob("* * * * * *", async function() {
const {
ticker: { sell }
} = await btc_price_ticker.getBtcPrice();
currency
.update({
params: {
id: "5cbdf078f5bcec257fcec792"
},
body: {
exchange_rate: sell,
lastUpdate: Date.now()
}
})
.catch(error => console.log(error));
});
It works fine, however I receive a TypeError: Cannot read property 'json' of undefined
I'm using the same function to update the database I use when updating by my API:
module.exports = {
async update(req, res) {
const currency = await Currency.findByIdAndUpdate(req.params.id, req.body, {
new: true
});
return res.json(currency);
}
};
The TypeError
happens in the return res.json(currency)
, and it only happens when it's called by the CronJob. When I put new information by API, it doesn't show any error.
I think it happens because when I call the function in CronJob
, I just pass the req
by parameter, but I don't know how to solve it. What am I supposed to do?
Thanks in advance!
There's a famous saying which says that you can solve almost any problem in CS by adding another layer of indirection. This is one of those cases:
Instead of of declaring your module as:
module.exports = {
async update(req, res) {
const currency = await Currency.findByIdAndUpdate(req.params.id, req.body, {
new: true
});
return res.json(currency);
}
};
Separate the logic from the route-logic:
module.exports = {
async getCurrency(id, params) {
const currency = await Currency.findByIdAndUpdate(id, params, {
new: true
});
return currency;
}
async update(req, res) {
const currency = await getCurrency(req.params.id, req.body);
return res.json(currency);
}
};
Now the route can call update()
and the cron-job can call getCurrency()
directly.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With