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

Node.js 如何记录通过express.static请求的文件,node.js,express,Node.js,Express,这是我的密码 var express=require("express"); var app=express(); var port=8181; app.use(express.static(__dirname)); app.listen(port); 它正确地服务于静态文件 我想在请求扩展名为.xls的文件时进行日志记录 如何实现它?核心模块为您提供了处理此问题的工具。因此,只需将此逻辑放在静态中间件之前的中间件中,如: 照办 var express=require("express");

这是我的密码

var express=require("express");
var app=express();
var port=8181;
app.use(express.static(__dirname));
app.listen(port);
它正确地服务于静态文件

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

如何实现它?

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

照办

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);
您想记录SERVICE static(
express.static
)在响应中给出的内容。有几种方法可以做到这一点

方法Ⅰ:手动检查的中间件。 如果请求是针对
express.static
,您可以将(
app.use
)一个中间件放在
express.static
之前记录请求。这样做。但是通过这种方式,当serve静态中间件的选项更改时,您必须重写代码以进行检查,这可能是一个维护问题

方法二挂钩到
express.static
;泄露信息。 嗯,
express.static
知道它提供的文件最好。不幸的是,它没有让我们知道并记录它。但有一个黑客攻击:,这是一个回调函数,据说用来设置自定义响应头。当
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);
    }
}));

@ahhmar注意,顺序很重要,如果您将静态中间件放在记录器中间件之上,则会发送响应,并且不会调用记录器
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);
    }
}));