我正在使用 nodejs 和 ejs 模板。我想设置一个仅在页面加载时调用的中间件,而不是在我从代码发送请求时调用。
例子:
app.use(function(req, res, next){
if(req.session){
console.log("OKAY");
}
next();
});
我希望这个日志只出现在页面加载时,而不是当我从下面的代码发送请求时
$.get( "/users", function( data ) {
console.log(data);
});
我该怎么做?
谢谢
最佳答案
你有几个选择:
在你的中间件中,你可以检查req.path查看它是否是您应该应用中间件的路径,并在您的中间件中使用
if
来调用next()
而不做任何事情或做任何事情中间件旨在执行此操作。您可以设计页面路由和 ajax 路由在不同路径上的路由,然后为页面路由设计一个路由器,为 ajax 路由设计一个路由器,并将中间件仅放在页面路由器上。
如果您设计您的 URL,那么您的服务器很容易区分这是一个应该或不应该应用中间件的 URL,这真的会对您有很大帮助(使用上述任一选项)。通常,最简单的方法是在 URL 设计的一个或两个分支上使用已知前缀。例如,所有 ajax URL 都可以以 /api
开头,然后您可以轻松地将所有 API 调用分流到一个特殊的路由器,所有其他 URL 都是非 API URL(可能是页面 URL)。
这是单独的 API 路由器的示例:
// split off all API calls to a separate router
let apiRouter = express.Router();
app.use('/api', apiRouter);
// handle /api/users
apiRouter.get('/users', handleUserAjaxRequest);
// handle all other /api/xxx routes that don't have their own handler
apiRouter.use(function(req, res, next) {
// if /api request not handled by here, then don't allow it to propagate further
// it must be a invalid /api/xxx URL, so do a 404
res.status(404).end();
});
// this won't get called if there's a /api/xxx URL because that will have
// already been handled by the apiRouter
app.use(someMiddleware);
app.get('/somepage', handleSomePageURL);
您还可以为所有页面请求使用单独的路由器,这可能会使模块化更加清晰,一个模块中的所有 API 路由和另一个模块中的所有页面路由,每个都导出自己的路由器。
关于javascript - Node : Middleware for only page loading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46064839/