在express中运行一次异步函数

时间:2015-07-07 16:12:17

标签: javascript asynchronous express promise

这是使异步函数只在express中运行一次的正确方法吗?我不希望这个功能必须在每条路线上运行。我正在寻找一种快速友好的方式来做到这一点。

var packageJson = false
app.use(function(req, res, next){
  if(req.packageJson) return next()
  if(packageJson){
    req.packageJson = packageJson
    return next()
  }
  return fs.readFileAsync("./package.json", "utf8")
  .then(JSON.parse)
  .then(function(data){
    packageJson = data
    req.packageJson = data
    return next()
  })  
})

2 个答案:

答案 0 :(得分:2)

我甚至不会在第一次调用该路由时运行异步函数,而只是执行

var packageJson = fs.readFileAsync("./package.json", "utf8").then(JSON.parse);
app.use(function(req, res, next){
  if (req.packageJson)
    return next();
  else
    packageJson.then(function(data){
      req.packageJson = data;
      return next();
    });
});

但不要忘记正确的错误处理,如果packageJSON承诺被拒绝,您的路线可能会无限期挂起。

答案 1 :(得分:1)

仅供参考(这不是通用解决方案,@ Bergi's),在这种特殊情况下,您可以使用require(),它有两个有用的功能:

  • 它可以直接加载JSON文件
  • 它会将文件数据缓存在内存中

中间件看起来像这样:

app.use(function(req, res, next){
  req.packageJson = require('./package.json');
  return next();
});

第一个请求会对性能产生很小的影响,因为require()是同步的,但对于后续请求,数据将自动从内存中读取。