NodeJS 使用“快速”不响应特定请求

gev0vcfq  于 2022-12-18  发布在  Node.js
关注(0)|答案(3)|浏览(150)

我想提供一些基于普通浏览器GET请求的HTML,但是如果user-agent请求头包含来自js变量myString的字符串,我想什么也不做响应(就好像域没有注册一样)。
我想这意味着我的服务器不能用状态100响应。但是这是怎么做到的呢?
我试着只添加一个return语句,这只是让请求挂起。我还试着添加res.status(404).end()res.destroy(),但浏览器中的结果与根本没有响应不同。
我怎样才能“不响应"浏览器对特定用户代理的请求,但在其他方面正常响应?

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
  const userAgent = req.headers['user-agent']
  const myString = 'firefox'
  if (userAgent.toLowerCase().includes(myString)) {
    res.destroy()
    return
  }
  res.setHeader("Content-Type", "text/html")
  res.send('<html><body>hello</body></html>')
})

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

我期望在浏览器中根本没有可见的结果,就好像域没有注册一样。
我问这个问题的原因是,考虑到iOS Safari浏览器在动态视口方面存在太多问题,以及苹果糟糕的实现所带来的所有困难,我打算不回应iPhone的请求。
成功标准:浏览器中的结果必须等于

if (userAgent.toLowerCase().includes(myString)) {
    res.redirect('https:/www.some-unregistered-url.com')
  }

但实际的url保持不变。

b1zrtrql

b1zrtrql1#

这样试试看:res.set(“连接”、“关闭”);或相对连接销毁();
但是如果你真的不想允许Firefox.你应该发送一个StatusCode 40 x. Badrequest 400或403 Forbidden,并带有这样的消息. Client not allow.

tvokkenx

tvokkenx2#

要想完全不响应请求,可以不调用res.send()或任何其他发送响应的方法。
实现这一点的一种方法是在if块后面添加一个return语句,检查用户代理字符串:

app.get('/', (req, res) => {
  const userAgent = req.headers['user-agent']
  const myString = 'firefox'
  if (userAgent.toLowerCase().includes(myString)) {
    return
  }
  res.setHeader("Content-Type", "text/html")
  res.send('<html><body>hello</body></html>')
})

这将导致服务器根本不为用户代理字符串包含myString的请求发送任何响应。请注意,在这种情况下,即使不发送响应正文,客户端仍将收到状态代码200(OK)。
如果要返回特定的状态代码,如404(未找到),可以调用res.sendStatus(404)或res.status(404).send()来发送不带响应正文的404响应。
需要注意的是,返回404状态码或任何其他非成功状态码都不会阻止客户端接收响应,它只会表明请求的资源没有找到。
如果你想完全阻止客户端接收响应,你可以简单地不调用res对象上的任何方法,这将导致服务器根本不发送任何响应。

rn0zuynd

rn0zuynd3#

返回一个空的html文档怎么样?

res.send('<html><body></body></html>')

你也可以试试

res.send('')

您还应该检查此服务器端浏览器检测
server-side browser detection? node.js

相关问题