Skip to content

Support HTTP QUERY method #5615

Closed
Closed

Description

@jonchurch

Honestly we might already, but opening this issue to track landing support and writing tests.

Node 21 added support for a new method! QUERY which is awesome, looks to have landed here nodejs/node#51719 in 21.7.2 (changelog)

@wesleytodd any idea what needs to be done to router to support QUERY? If this Issue belongs at router plz do move it!
We may actually already support this ¯_(ツ)_/¯ and it's just that a test is failing.

Im unable to get it to work in Node 21.7.3 currently, and left a comment in the node tracking issue for support nodejs/node#51562

TODO:

Activity

  1. jonchurch commented on Apr 20, 2024

    @jonchurch
    MemberAuthor

    Edit: this will light up once it fully lights up in Node, see the Node repro at the bottom

    Here's my test harness rn, I don't think we support this automatically

    ✨✨✨

    const express = require('express');
    const app = express();
    const router = express.Router();
    
    app.use(express.json());
    
    // Test using app.query (if this is valid)
    try {
      app.query('/test-app-query', (req, res) => {
        console.log({ body: req.body });
        res.status(200).json({ data: req.body });
      });
      console.log("app.query() tested and set up.");
    } catch (error) {
      console.error("app.query() failed:", error);
    }
    
    // Test using router.query (if this is valid)
    try {
      router.query('/test-router-query', (req, res) => {
        console.log({ body: req.body });
        res.status(200).json({ data: req.body });
      });
      app.use(router);
      console.log("router.query() tested and set up.");
    } catch (error) {
      console.error("router.query() failed:", error);
    }
    
    // Fallback general middleware to check if QUERY method is getting through
    app.use('/test', (req, res, next) => {
      if (req.method === 'QUERY') {
        console.log('Received QUERY method via general handler');
        res.status(200).json({ received: req.body });
      } else {
        next();
      }
    });
    
    // General error handler
    app.use((err, req, res, next) => {
      console.error('Error Handler:', { err });
      res.status(500).send('Server Error');
    });
    
    app.listen(3000, () => {
      console.log("Server listening on port 3000");
    });

    These are the curl requests Im using:

    curl -i -X QUERY -H "Content-Type: application/json" -d '{"foo": "bar"}' http://localhost:3000/test-app-query
    curl -i -X QUERY -H "Content-Type: application/json" -d '{"foo": "bar"}' http://localhost:3000/test-router-query
    curl -i -X QUERY -H "Content-Type: application/json" -d '{"foo": "bar"}' http://localhost:3000/test

    They each give me a response of:

    HTTP/1.1 404 Not Found
    X-Powered-By: Express
    Content-Security-Policy: default-src 'none'
    X-Content-Type-Options: nosniff
    Content-Type: text/html; charset=utf-8
    Content-Length: 159
    Date: Sat, 20 Apr 2024 22:33:30 GMT
    Connection: keep-alive
    Keep-Alive: timeout=5
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8">
    <title>Error</title>
    </head>
    <body>
    <pre>Cannot undefined /test-app-query</pre>
    </body>
    </html>
    

    CURL shouldn't matter here, but just in case:

    curl --version
    
    curl 8.4.0 (x86_64-apple-darwin23.0) libcurl/8.4.0 (SecureTransport) LibreSSL/3.3.6 zlib/1.2.12 nghttp2/1.58.0
    Release-Date: 2023-10-11
    Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
    Features: alt-svc AsynchDNS GSS-API HSTS HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz MultiSSL NTLM NTLM_WB SPNEGO SSL threadsafe UnixSockets
    

    Maybe node really doesn't support this yet? Check this out:

    const http = require('http');
    
    // Do we know about query?
    console.log(http.METHODS.includes('QUERY')) // true
    
    // Create an HTTP server
    const server = http.createServer((req, res) => {
      // Log the method to the console for verification
      console.log('Received method:', req.method);
    
      // Check if the method is QUERY
      if (req.method === 'QUERY') {
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.end('Received a QUERY method request');
      } else {
        // Respond with Method Not Allowed if the method is not QUERY
        res.writeHead(405, { 'Content-Type': 'text/plain' });
        res.end('Method Not Allowed');
      }
    });
    
    // Listen on port 3000
    server.listen(3000, () => {
      console.log('Server listening on port 3000');
    });
    node -v
    # v21.7.3
    curl -i -X QUERY -H "Content-Type: application/json" -d '{"foo": "bar"}' http://localhost:3000
    
    HTTP/1.1 405 Method Not Allowed
    Content-Type: text/plain
    Date: Sat, 20 Apr 2024 23:22:16 GMT
    Connection: keep-alive
    Keep-Alive: timeout=5
    Transfer-Encoding: chunked
    
    Method Not Allowed
  2. sheplu commented on Apr 21, 2024

    @sheplu
    Member

    I may be wrong but I do think this is supported by express? I do remember that it worked with a manually build version of Node.js but not with the latest release @wesleytodd

  3. wesleytodd commented on Apr 22, 2024

    @wesleytodd
    Member

    Yeah that is quite possible. I thought the version with this fixed was supposed to go out with the security patch but maybe I misunderstood and it was set to land later? Based on this yes I am thinking that is the case: nodejs/node#51562 (comment)

  4. added a commit that references this issue on May 22, 2024
  5. jonchurch commented on Jun 5, 2024

    @jonchurch
    MemberAuthor

    Looks like this is now passing in Node v22.2.0, which includes this commit nodejs/node@65c8380

    I don't think support will come to node 21, as the change was considered semver major by Node.

  6. kapouer commented on May 20, 2025

    @kapouer
    Contributor

    It seems that node 20.19.2 has the same issue.

  7. wesleytodd commented on May 20, 2025

    @wesleytodd
    Member

    A fix should be landed in both v4 and v5:

    #6513
    #6512

  8. CxRes commented on May 22, 2025

    @CxRes

    Please update the documentation to reflect this. See expressjs/expressjs.com#1912

  9. RobinTail commented on Jun 5, 2025

    @RobinTail
    Contributor

    @wesleytodd , should we declare the query method support in @types/express?

    Image

    Image
  10. wesleytodd commented on Jun 5, 2025

    @wesleytodd
    Member

    Unfortunately I think it is still unstable in our supported node.js versions, so adding it to the types might lead folks to believe they can use it when they cannot. I don't know of a way to have the types be different depending on the Node.js version, but if there is one that I am unaware of, 22 and up have stable support for QUERY.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions