Node.js-将响应状态代码记录到控制台(一个la Django开发服务器)

Node.js - Logging response statusCode to console (a la Django development server)

本文关键字:la 一个 Django 开发 服务器 控制台 js- 响应 状态 记录 代码      更新时间:2023-09-26

我正在尝试构建一个Node.js服务器,该服务器具有类似于Django开发服务器的控制台日志记录。例如

[27/Jun/2011 15:26:50] "GET /?test=5 HTTP/1.1" 200 545

以下server.js(基于Node初学者教程)为我提供了时间和请求信息:

var http = require("http");
var url = require ("url");
var port = 1234;
function start(route, handle) {
    function onRequest(request, response) {
        var pathname = url.parse(request.url).pathname;
        var query = url.parse(request.url).query;
        route(handle, pathname, query, response);
        logRequest(request);
    }
    http.createServer(onRequest).listen(port);
    console.log("'nServer running at http://192.168.1.5:" + port + "/");
    console.log("Press CONTROL-C to quit.'n");
}
function logRequest(request) {
    var pathname = url.parse(request.url).pathname;
    var query = url.parse(request.url).query;
    if (query == undefined) {
        query = "";
    }
    var currentDate = new Date();
    var day = currentDate.getDate();
    var month = currentDate.getMonth() + 1;
    var year = currentDate.getFullYear();
    var hours = currentDate.getHours();
    var minutes = currentDate.getMinutes();
    var seconds = currentDate.getSeconds();
    if (minutes < 10) {
        minutes = "0" + minutes;
    }
    if (seconds < 10) {
        seconds = "0" + seconds;
    }
    console.log("[" + year + "/" + month + "/" + day + 
                " " + hours + ":" + minutes + ":" + seconds + '] "' +
                request.method + " " + pathname + query +
                " HTTP/" + request.httpVersion + '"');
}    
exports.start = start;

问题:我该如何更新此代码以获得response.statusCode以及日志输出中的"545"数字?

当我尝试将响应对象添加到logRequest函数时,响应状态代码总是"200",即使我知道(通过调试日志)我的router.js正在生成404个错误。

如果您使用的是链接教程中的路由方法,那么使用response.statusCode不起作用的原因是因为他们使用此行设置了404状态代码

response.writeHead(404, {"Content-Type": "text/html"});

如果你看一下Node.JS Docs-writeHead的文档,它指出.writeHead不会设置.statusCode值。如果您想使用.statusCode值,您应该将route方法中的行更改为如下所示:

response.statusCode = 404;
response.setHeader("Content-Type", "text/html");

直接为statusCode赋值并使用"隐式"标头声明(setHeader而不是writeHead)将为用户产生相同的结果,但在您这边,稍后您可以在日志方法中访问statusCode。