写一段代码用filter的方式实现统计网站被访问的次数,需要支持所有的资源,包含静态资源和动态资源
时间: 2024-05-11 15:15:29 浏览: 13
好的,以下是代码示例:
```
// 用于统计资源访问次数的对象
const visitCount = {}
function countVisits(req, res, next) {
const url = req.url
// 如果当前资源不存在对应的访问次数记录,则初始化为0
if (!visitCount[url]) {
visitCount[url] = 0
}
// 增加当前资源的访问次数
visitCount[url]++
next()
}
// 在所有请求处理函数之前,添加统计访问次数的中间件
app.use(countVisits)
// 静态资源的处理方法
app.use(express.static('public'))
// 动态资源的处理方法
app.use('/api', apiRouter)
// 获取所有访问次数非0的资源及其访问次数
app.get('/stats', (req, res) => {
const visitedUrls = Object.keys(visitCount).filter(url => visitCount[url] > 0)
const stats = visitedUrls.map(url => ({ url, visits: visitCount[url] }))
res.json(stats)
})
```
这段代码定义了一个中间件函数 `countVisits`,用于统计各个资源的访问次数,并将结果保存在一个对象 `visitCount` 中。该中间件函数使用了 `express.js` 框架提供的 `next` 函数,用于传递请求给下一个处理函数。
在实际应用中,需要在所有请求处理函数之前添加该中间件函数。
最后,该代码提供了一个 `/stats` 接口,用于获取所有访问次数非0的资源及其访问次数。该接口使用了 `filter` 方法来过滤出访问次数大于0的资源,并使用 `map` 方法将这些资源对应的访问次数转换为一个数组。最终,将该数组作为 JSON 格式的响应返回给客户端。