使用ExpressJS提供非标准HTTP方法

Pie*_*yle 7 http node.js express

我想编写一个HTTP服务器,使用非标准HTTP方法(动词)回答请求.例如,客户端会发出类似的请求FOO / HTTP/.1.1.在服务器端,此请求将由以下内容处理:

var express = require('express');

var app = express.createServer();

app.configure(function(){
  app.use(express.logger({ format: ':method :url' }));
  app.use(express.methodOverride());
});

app.foo('/', function(req, res){
    res.send('Hello World');
});

app.listen(3000);
Run Code Online (Sandbox Code Playgroud)

我将非标准方法附加到ExpressJS中导出的数组中lib/router/methods.js.这允许我按预期编写我的服务器代码.使用express.methodOverride()POST请求时_method=foo,它的工作原理.但实际的FOO请求不起作用.一旦客户端发送请求的第一行,服务器就会关闭连接:

$telnet localhost 3000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
FOO / HTTP/1.1
Connection closed by foreign host.
Run Code Online (Sandbox Code Playgroud)

我希望能够使用ExpressJS实现这一点,而不会避免入侵其核心文件.

知道这是否可行以及怎么做?

bro*_*ofa 6

简短的回答:不,这不可能。并非没有实现自己的HTTP模块。

要测试,请启动准系统HTTP服务器...

$ node
> require('http').createServer(function(req, res) {
...   console.log(req.method);
...   res.end();
... }).listen(8080);
Run Code Online (Sandbox Code Playgroud)

然后(正如您已经完成的那样)远程登录到它并发出GET和FOO请求...

$ telnet localhost 8080
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1

HTTP/1.1 200 OK
Connection: keep-alive
Transfer-Encoding: chunked

0

FOO / HTTP/1.1
Connection closed by foreign host.

$ 
Run Code Online (Sandbox Code Playgroud)

在节点控制台中,您将看到

GET
Run Code Online (Sandbox Code Playgroud)

...但是没有FOO。因此,Express使用的节点的本机HTTP模块不会使这些请求可用。

  • 仅发布更新-在当前节点(4.6)和表达(4)版本中,您可以处理自定义HTTP动词。监听`app.all`,然后在回调中检查`req.method`。 (3认同)