【已解决】TJ的node-methods里面的Nodejs http.METHODS疑问

【已解决】TJ的node-methods里面的Nodejs http.METHODS疑问

应该有人看过TJ的node-methods这个模块把

我看commit历史里面有一个:

引入了http模块:

var http = require('http');

if (http.METHODS) {

module.exports = http.METHODS.map(function(method){ return method.toLowerCase(); });

} else {

实际上官方的api是查不到http模块有METHODS 这个属性的,这个写法为啥?


6 回复

【已解决】TJ的node-methods里面的Nodejs http.METHODS疑问

问题背景

最近我在研究TJ大神的node-methods模块时,遇到了一个问题。我注意到在该模块的源码中,有如下一段代码:

var http = require('http');

if (http.METHODS) {
  module.exports = http.METHODS.map(function(method){
    return method.toLowerCase();
  });
} else {
  // 处理没有http.METHODS的情况
}

问题描述

在官方的Node.js文档中,并没有提到http模块具有METHODS这个属性。那么,为什么这段代码会存在呢?

解释

实际上,http.METHODS并不是Node.js核心库中的一个标准属性。它可能是TJ为了方便处理HTTP方法而自定义的一个属性。在Node.js的早期版本中,可能有一些尝试性的实现,但后来并没有保留下来。

不过,我们可以通过其他方式获取HTTP方法列表。例如,我们可以直接定义一个包含所有HTTP方法的数组:

const METHODS = [
  'ACL',
  'BIND',
  'CHECKOUT',
  'CONNECT',
  'COPY',
  'DELETE',
  'GET',
  'HEAD',
  'LINK',
  'LOCK',
  'M-SEARCH',
  'MERGE',
  'MKACTIVITY',
  'MKCALENDAR',
  'MKCOL',
  'MOVE',
  'NOTIFY',
  'OPTIONS',
  'PATCH',
  'POST',
  'PROPFIND',
  'PROPPATCH',
  'PURGE',
  'PUT',
  'REBIND',
  'REPORT',
  'SEARCH',
  'SUBSCRIBE',
  'TRACE',
  'UNBIND',
  'UNLINK',
  'UNLOCK',
  'UNSUBSCRIBE'
];

module.exports = METHODS.map(method => method.toLowerCase());

示例代码

以下是一个完整的示例代码,展示了如何定义并导出HTTP方法列表:

// methods.js
const METHODS = [
  'ACL',
  'BIND',
  'CHECKOUT',
  'CONNECT',
  'COPY',
  'DELETE',
  'GET',
  'HEAD',
  'LINK',
  'LOCK',
  'M-SEARCH',
  'MERGE',
  'MKACTIVITY',
  'MKCALENDAR',
  'MKCOL',
  'MOVE',
  'NOTIFY',
  'OPTIONS',
  'PATCH',
  'POST',
  'PROPFIND',
  'PROPPATCH',
  'PURGE',
  'PUT',
  'REBIND',
  'REPORT',
  'SEARCH',
  'SUBSCRIBE',
  'TRACE',
  'UNBIND',
  'UNLINK',
  'UNLOCK',
  'UNSUBSCRIBE'
];

module.exports = METHODS.map(method => method.toLowerCase());

// 使用示例
const methods = require('./methods.js');
console.log(methods);

结论

虽然http.METHODS不是Node.js核心库的一部分,但我们可以通过手动定义一个数组来达到相同的效果。这样可以确保我们的代码在不同版本的Node.js中都能正常工作。


http.METHODS GET/POST/PUT/DEL 作用是降为小写。

查了一下Node.js的源代码,从Node.js v0.11.8开始的http模块才有exports.METHODS的定义。官方站点的API文档还是Node.js 0.10.30的,所以没有这个方法的说明。

node不都7.4.0了吗,怎么还总说v0.10.xx

http.METHODS 并不是 Node.js 官方文档中 http 模块的标准属性。但从你提供的代码片段来看,这段代码是为了获取 HTTP 方法(如 GET、POST 等)列表。

实际上,HTTP 方法列表并不是直接在 http 模块中定义的,而是通过一些间接方式获取的。以下是一个简单的示例代码,展示如何获取这些方法:

const http = require('http');

// 获取 HTTP 方法列表
let methods;

if (http.METHODS) {
  // 如果 http.METHODS 已经存在,则直接使用它
  methods = http.METHODS.map((method) => method.toLowerCase());
} else {
  // 否则,手动创建一个包含常用 HTTP 方法的数组
  methods = [
    'get', 'post', 'put', 'delete', 'options', 'head',
    'patch', 'trace', 'connect'
  ];
}

console.log(methods);

解释:

  1. 检查 http.METHODS:首先检查 http 模块是否已经定义了 METHODS 属性。
  2. 映射到小写:如果存在 METHODS 属性,则将其所有方法名转换为小写形式。
  3. 手动定义:如果 METHODS 不存在,则手动定义一个常用的 HTTP 方法数组,并转换为小写形式。

实际情况:

  • 在某些版本的 Node.js 中,http.METHODS 可能会直接提供这些方法列表。
  • 但为了兼容性,通常会手动定义这些方法,以确保在不同环境中都能正常工作。

这种方法可以确保你的代码在不同的 Node.js 版本和环境下都能正确运行。

回到顶部