如何记录通过 express.static 请求的文件

how to log the file requested via express.static

这是我的代码

var express=require("express");
var app=express();
var port=8181;
app.use(express.static(__dirname));
app.listen(port);

它正在正确提供静态文件

我想在请求扩展名为 .xls 的文件时记录

我怎样才能实现它?

path 核心模块为您提供了处理此问题的工具。因此,只需将此逻辑放在静态中间件 之前的中间件 中,例如:

var express = require("express");
var path = require("path");

var app = express();
var port = 8181;

app.use(function (req, res, next) {
    var filename = path.basename(req.url);
    var extension = path.extname(filename);
    if (extension === '.css')
        console.log("The file " + filename + " was requested.");
    next();
});
app.use(express.static(__dirname));

app.listen(port);

随心所欲

var express=require("express");
var app=express();
var port=8181;

app.use(function(req, res, next) {
    // check for .xls extension
    console.log(req.originalUrl);
    next();
}, express.static(__dirname));

app.listen(port);

您想记录 serve-static (express.static) 给出的响应。有几种方法可以做到这一点。

方法一手工校验的中间件

您可以在 express.static 之前放置 (app.use) 一个中间件,用于记录针对 express.static 的请求。 Rodrigo Medeiros' answer 这样做。但是这样,serve-static 中间件的选项发生变化时,你必须重写检查代码,这可能是一个维护问题。

方法二挂钩到express.static;从中泄露信息。

好吧,express.static 知道它提供的最好的文件。不幸的是,它只是不让我们知道并记录它。但是有一个技巧:the setHeaders option,这是一个回调函数,据说用于设置自定义响应 headers。当 express.static 做出响应并获得足够的信息来记录您想要记录的内容时,它会被调用。

const express = require("express");
const path = require("path");
const app = express();
const asset_dir_path = "assets/";

app.use(express.static(asset_dir_path, {
    index: false,
    setHeaders: (response, file_path, file_stats) => {
        // This function is called when “serve-static” makes a response.
        // Note that `file_path` is an absolute path.

        // Logging work
        const relative_path = path.join(asset_dir_path, path.relative(asset_dir_path, file_path));
        console.info(`@${Date.now()}`, "GAVE\t\t", relative_path);
    }
}));