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()时才能到达第二个