Node.js 在restapi中,如何使用Nodejs限制浏览器对URL的访问&;快车

Node.js 在restapi中,如何使用Nodejs限制浏览器对URL的访问&;快车,node.js,rest,api,express,Node.js,Rest,Api,Express,我有一个MEAN stack应用程序,使用Node.js和Express.js作为后端API 假设我有如下“评论”路线 /* GET /comments listing. */ router.get("/", function(req, res, next) { Comment.find(function(err, comments) { if (err) return next(err); res.json(comments); }); });

我有一个MEAN stack应用程序,使用Node.js和Express.js作为后端API

假设我有如下“评论”路线

/* GET /comments listing. */
router.get("/", function(req, res, next) {
    Comment.find(function(err, comments) {
        if (err) return next(err);
        res.json(comments);
    });
});
并在我的服务器中使用它,如下所示:

var commentsRouter = require('./routes/comments');
...
app.use('/comments', commentsRouter);
我的问题是:有没有办法阻止用户访问
http://mrUrl/comments
在浏览器中使用403禁止消息拒绝请求,但同时JavaScript文件尝试访问同一URL时将收到内容消息(示例中应为
res.json(comments);


另外,是否可以对所有路由启用一次这样的限制,而不是对每个路由启用。

是的,您可以使用
中间件

中间件是一个可以在正在执行的主函数之前或之后传递的函数(在本例中,
GET comments

函数位置的顺序很重要,但先到先执行,您可以这样实现它:

app.use(myBrowsingRestrictionMiddlewareFunction) // Runs 

app.use('/comments', commentsRouter);

app.use('/account', accountRouter);
您还可以在
路由处理程序中使用:

app.post('/comments', myMakeSureDataIsAlrightFunction, myMainCreateCommentFunction, myAfterStatusWasSentToClientAndIWishToMakeAnotherInternalActionMiddleware);
属性
req、res、next
自动传递到函数中

这意味着,
myBrowsingRestrictionMiddlewareFunction
接收它们,您可以像这样使用它们:

export function myBrowsingRestrictionMiddlewareFunction(req, res, next) {
  if (req.headers['my-special-header']) {
     // custom header exists, then call next() to pass to the next function
     next();

  } else {

    res.sendStatus(403);      

  }
}
编辑

扩展在FS结构中放置中间件的位置(个人建议):

我喜欢做的是将路由器与app.js分开,如下所示:

app.js

路由器.js

commentsRouter.js


是的,您可以使用
中间件

中间件是一个可以在正在执行的主函数之前或之后传递的函数(在本例中,
GET comments

函数位置的顺序很重要,但先到先执行,您可以这样实现它:

app.use(myBrowsingRestrictionMiddlewareFunction) // Runs 

app.use('/comments', commentsRouter);

app.use('/account', accountRouter);
您还可以在
路由处理程序中使用:

app.post('/comments', myMakeSureDataIsAlrightFunction, myMainCreateCommentFunction, myAfterStatusWasSentToClientAndIWishToMakeAnotherInternalActionMiddleware);
属性
req、res、next
自动传递到函数中

这意味着,
myBrowsingRestrictionMiddlewareFunction
接收它们,您可以像这样使用它们:

export function myBrowsingRestrictionMiddlewareFunction(req, res, next) {
  if (req.headers['my-special-header']) {
     // custom header exists, then call next() to pass to the next function
     next();

  } else {

    res.sendStatus(403);      

  }
}
编辑

扩展在FS结构中放置中间件的位置(个人建议):

我喜欢做的是将路由器与app.js分开,如下所示:

app.js

路由器.js

commentsRouter.js


Javascript将在浏览器上运行,所以您只能从浏览器获取请求。为了防止仅仅通过将url放入地址栏而在浏览器中获得结果,您需要将此请求作为POST请求。什么是“您需要将此请求作为POST请求”的意思?对于不同的模型,有两个具有不同HTTp谓词的路由处理程序和中间件。我真的不明白你的意思。就像下面的例子,router.post('\',handler)。这样,您就无法从浏览器地址栏获取数据。此外,您还要检查传入请求中的标题,以确保@Omer ShukarJavascript提供的示例将在浏览器上运行,所以您将只从浏览器获取请求。为了防止仅仅通过将url放入地址栏而在浏览器中获得结果,您需要将此请求作为POST请求。什么是“您需要将此请求作为POST请求”的意思?对于不同的模型,有两个具有不同HTTp谓词的路由处理程序和中间件。我真的不明白你的意思。就像下面的例子,router.post('\',handler)。这样,您就无法从浏览器地址栏获取数据。此外,您还可以检查传入请求中的标头,以确保@Omer Shukar使用中间件提供的以下示例对我有意义,但我不太理解您的路由处理程序方法。然而,会是“我的特别标题”吗?myBrowsingRestrictionMiddlewareFunction应位于何处?可能在app.js(server.js)中?如果您的路由处理程序位于app.js中,那么可以将其放置在app.js中,在路由处理程序本身之前。在帖子中还添加了我的方法什么是“我的特殊头”?您可以调整客户端,为发送到服务器的每个请求生成自定义头。例如,在
Angular
中,可以使用
HTTP拦截器。但是,使用任何其他框架或纯JS都可以实现这一点,使用中间件向
新的XMLHttpRequest
附加一个具有某种价值的头对我来说是有意义的,但我不太理解您的路由处理程序方法。然而,会是“我的特别标题”吗?myBrowsingRestrictionMiddlewareFunction应位于何处?可能在app.js(server.js)中?如果您的路由处理程序位于app.js中,那么可以将其放置在app.js中,在路由处理程序本身之前。在帖子中还添加了我的方法什么是“我的特殊头”?您可以调整客户端,为发送到服务器的每个请求生成自定义头。例如,在
Angular
中,可以使用
HTTP拦截器。但是,您可以使用任何其他框架或纯JS实现这一点,在
newXMLHttpRequest