这是使异步函数只在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()
})
})
答案 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()
,它有两个有用的功能:
中间件看起来像这样:
app.use(function(req, res, next){
req.packageJson = require('./package.json');
return next();
});
第一个请求会对性能产生很小的影响,因为require()
是同步的,但对于后续请求,数据将自动从内存中读取。