Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在express中运行异步函数一次_Javascript_Asynchronous_Express_Promise - Fatal编程技术网

Javascript 在express中运行异步函数一次

Javascript 在express中运行异步函数一次,javascript,asynchronous,express,promise,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.re

这是让异步函数在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()
  })  
})

我甚至不会在对该路由的第一次调用中运行异步函数,而是直接运行

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
承诺被拒绝,那么您的路由可能会无限挂起。

我甚至不会在对该路由的第一次调用中运行异步函数,而只是这样做

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
承诺被拒绝,那么您的路由可能会无限挂起。

我甚至不会在对该路由的第一次调用中运行异步函数,而只是这样做

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
承诺被拒绝,那么您的路由可能会无限挂起。

我甚至不会在对该路由的第一次调用中运行异步函数,而只是这样做

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
承诺被拒绝,您的路由可能会无限挂起。

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

  • 它可以直接加载JSON文件
  • 它会将文件数据缓存在内存中
中间件如下所示:

app.use(function(req, res, next){
  req.packageJson = require('./package.json');
  return next();
});
第一个请求对性能的影响很小,因为
require()
是同步的,但对于后续请求,数据将自动从内存中读取。

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

  • 它可以直接加载JSON文件
  • 它会将文件数据缓存在内存中
中间件如下所示:

app.use(function(req, res, next){
  req.packageJson = require('./package.json');
  return next();
});
第一个请求对性能的影响很小,因为
require()
是同步的,但对于后续请求,数据将自动从内存中读取。

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

  • 它可以直接加载JSON文件
  • 它会将文件数据缓存在内存中
中间件如下所示:

app.use(function(req, res, next){
  req.packageJson = require('./package.json');
  return next();
});
第一个请求对性能的影响很小,因为
require()
是同步的,但对于后续请求,数据将自动从内存中读取。

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

  • 它可以直接加载JSON文件
  • 它会将文件数据缓存在内存中
中间件如下所示:

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

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

因为它是一个JSON文件,我可能会使用
require()
:-)@robertklep:是的,可能,但是
require
不是异步的。哦,它也会为我们做缓存,所以这感觉像作弊:-)但它只被读取到内存中一次,之后数据从内存中被提供,这基本上与将数据“存储”在承诺值中是一样的(我同意它有点作弊,但这不是一个通用的解决方案)。我想展示如何使用任何通用异步函数来实现它
require
对于这个特定的用例可能是更好的选择。因为它是一个JSON文件,我可能会使用
require()
:-)@robertklep:是的,也许吧,但是
require
不是异步的。哦,它也会为我们做缓存,所以这感觉像作弊:-)但它只被读取到内存中一次,之后数据从内存中被提供,这基本上与将数据“存储”在承诺值中是一样的(我同意它有点作弊,但这不是一个通用的解决方案)。我想展示如何使用任何通用异步函数来实现它
require
对于这个特定的用例可能是更好的选择。因为它是一个JSON文件,我可能会使用
require()
:-)@robertklep:是的,也许吧,但是
require
不是异步的。哦,它也会为我们做缓存,所以这感觉像作弊:-)但它只被读取到内存中一次,之后数据从内存中被提供,这基本上与将数据“存储”在承诺值中是一样的(我同意它有点作弊,但这不是一个通用的解决方案)。我想展示如何使用任何通用异步函数来实现它
require
对于这个特定的用例可能是更好的选择。因为它是一个JSON文件,我可能会使用
require()
:-)@robertklep:是的,也许吧,但是
require
不是异步的。哦,它也会为我们做缓存,所以这感觉像作弊:-)但它只被读取到内存中一次,之后数据从内存中被提供,这基本上与将数据“存储”在承诺值中是一样的(我同意它有点作弊,但这不是一个通用的解决方案)。我想展示如何使用任何通用异步函数来实现它<代码>要求对于这个特定用例可能是更好的选择。