Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.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 如何使用Node.js正确地服务私有静态文件?_Javascript_Node.js_Express - Fatal编程技术网

Javascript 如何使用Node.js正确地服务私有静态文件?

Javascript 如何使用Node.js正确地服务私有静态文件?,javascript,node.js,express,Javascript,Node.js,Express,我想保护上传的图像。用户上载图像时,图像将保存到以下路径: public/dogs/{userId}/{imageName} 每个用户都有自己的保存图像的目录。我发现,如果我这样做,我可以很容易地为这些图像提供服务,但是每个人都可以访问这些图像: app.use(express.static('public')); 我的用户验证的工作方式与我检查请求url是否在路径中包含/api/admin。例如: router.get('/api/admin/dogs', dog.getAll); 我想

我想保护上传的图像。用户上载图像时,图像将保存到以下路径:

public/dogs/{userId}/{imageName}
每个用户都有自己的保存图像的目录。我发现,如果我这样做,我可以很容易地为这些图像提供服务,但是每个人都可以访问这些图像:

app.use(express.static('public'));
我的用户验证的工作方式与我检查请求url是否在路径中包含
/api/admin
。例如:

router.get('/api/admin/dogs', dog.getAll);
我想以类似的方式提供图像,只允许管理员访问它们。有没有可能有这样的东西:

router.get('/api/admin/dogs/images/:userId/:imageName', image.getOne);
router.get('/api/admin/dogs/images/:userId/:imageName', function(req, res, next){
  currentUserHasAccessTo(userId, imageName, function(err) {
    if (err)
      next(err)
    else
      res.sendFile(`public/dogs/${userId}/${imageName}`)
  })
});

谢谢您的帮助。

响应
对象上有一个
发送文件
功能。您可以使用它根据用户验证发送文件

应该是这样的:

router.get('/api/admin/dogs/images/:userId/:imageName', image.getOne);
router.get('/api/admin/dogs/images/:userId/:imageName', function(req, res, next){
  currentUserHasAccessTo(userId, imageName, function(err) {
    if (err)
      next(err)
    else
      res.sendFile(`public/dogs/${userId}/${imageName}`)
  })
});
currentUserHasAccessTo
是查询数据库或其他内容的验证函数。
如果返回错误,它将被传递到错误处理程序中间件,以便显示默认图像或错误页面。

您还可以使用处理程序的堆叠:

router.get('/api/admin/dogs/images/:userId/:imageName', function(req, res, next){
  currentUserHasAccessTo(userId, imageName, function(err) {
   if (err)
     next(err); // or res.send(401) if unauthorized
   else
     res.next() ; // this will "jump" to the express.static below
  })
, express.static('public') });
在本例中,一条路由有两个处理程序。只有在调用next()时才能到达第二个