在快速路由中,我想记录用户对数据库的访问,但不包含:

  • 等待其完成后再执行用户想要的任务
  • 关心日志记录是否成功

我想知道代码是否正确执行此操作。

该线程( Down-side on calling async function without await )本质上发布了相同的问题,但响应是避免使函数异步。然而自从sequelizeupsert返回一个 promise ,我不确定我在下面的代码中是否正确执行了该操作。谁能验证一下吗?

我还注意到,如果您不在异步函数的 try-catch block 中等待 promise ,则 promise 内引发的任何错误都将无法处理。因此我确定logAccess捕获并处理任何错误。这是正确的做事方式吗?

const { Router } = require('express'); 
const moment = require('moment-timezone'); 
const Sequelize = require('sequelize'); 
 
function timeout(ms) { 
  return new Promise(resolve => setTimeout(resolve, ms)); 
} 
 
const userTable = sequelize.define('user', { 
  user_id: { 
    type: Sequelize.UUID, 
    primaryKey: true, 
  }, 
  last_login: { 
    type: 'TIMESTAMP', 
  }, 
}); 
 
const logAccess = (user) => userTable.upsert({ 
  user_id: user.user_id, 
  last_login: moment().tz('Australia/Sydney').format('YYYY-MM-DD HH:mm:ss'), 
}).catch(() => console.log('Logging access to db failed')); 
 
const makeCandy = async (user) => { 
  await timeout(1000); 
  return 'chocolate'; 
} 
 
router.get('/get_candy', async (req, res) => { 
  try { 
    const user = req.body.user; 
    // Log access without blocking thread 
    logAccess(user); 
    const candy = await makeCandy(user) 
    res.status(200).send({ candy }) 
 
  } catch (e) { 
    console.log(e); 
  } 
}) 

请您参考如下方法:

不等待就不会捕获:

const foo = () => Promise.reject('foo'); 
 
const bar = async() => { 
  try { 
    foo(); 
  } catch (e) { 
    console.log('error caught'); 
  } 
} 
 
bar();

我至少得到了“未被捕获( promise )”。

我会捕获 promise 风格的错误

    logAccess(user).catch(someErrorHandlingFunction); 

或者在我不等待的单独函数中:

const logAccessAndCatchErrors = async (user) => { 
    try { 
        await logAccess(user); 
    } catch(e) { 
// put something here 
    } 
} 
 
//... 
logAccessAndCatchErrors(user);  // not `await logAccessAndCatchErrors(user)` 
 
 


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!