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.
custom
is anasync
function thus is ALWAYS returns a promise. That's how ALLasync
functions 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
async
callback.One way to solve this problem would be to remove the
await
onawait log.addLog(...)
so you can then remove theasync
on thecustom
function: