So i have this code
const log = require("./queries/logQuery");
const moment = require('moment');
const morgan = require('morgan');
const custom = async (tokens, req, res) => {
if(req.session){
if(req.session.superadmin){
const date = moment().locale('id').format('DD-MM-YYYY HH:mm:ss');
const usr = req.session.superadmin;
const method = tokens.method(req, res);
const endpoint = tokens.url(req, res);
const statusCode = tokens.status(req, res);
await log.addLog(date, usr, method, endpoint, statusCode)
}else if(req.session.user){
const date = moment().locale('id').format('DD-MM-YYYY HH:mm:ss');
const usr = req.session.user;
const method = tokens.method(req, res);
const endpoint = tokens.url(req, res);
const statusCode = tokens.status(req, res);
await log.addLog(date, usr, method, endpoint, statusCode)
}
return [
tokens.method(req, res),
tokens.url(req, res),
tokens.status(req, res),
tokens.res(req, res, 'content-length'), '-',
tokens['response-time'](req, res), 'ms'
].join(' ')
}
}
router.use(morgan(custom))
I'm trying to use async in the morgan logger, however the return always gave me "[object Promise]", i've tried setting each of the return using await but to no avail, how to fix this?
This is a confusing question.
customis anasyncfunction thus is ALWAYS returns a promise. That's how ALLasyncfunctions work.But, it looks like morgan wants the callback you pass it to synchronously return that array. You can't do what you're trying to do the way you're trying to do it as the morgan API does not support using an
asynccallback.One way to solve this problem would be to remove the
awaitonawait log.addLog(...)so you can then remove theasyncon thecustomfunction: