【问题标题】:Getting 426 Update Required when testing express server测试快速服务器时需要获取 426 更新
【发布时间】:2025-12-27 19:55:12
【问题描述】:

所以我正在使用 express 构建一个简单的网络应用程序,并希望从一开始就进行单元测试。所以我创建了一个简单的测试来查看“/”是否返回 200。但我的测试总是说他们收到 426。我在网上找不到关于这个问题的任何信息,并且相信我正确设置了服务器。

这是我的服务器:

// server.js    
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const winston = require('winston')

const app = express();

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.json(),
    defaultMeta: { service: 'user-service' },
    transports: [
        new winston.transports.File({ filename: 'error.log', level: 'error' }),
        new winston.transports.File({ filename: 'combined.log' })
    ]
})

if (process.env.NODE_ENV !== 'production') {
    logger.add(new winston.transports.Console({
        format: winston.format.simple()
    }))
}

app.use(
  bodyParser.urlencoded({
    extended: false,
  })
);
app.use(bodyParser.json());
app.use(cors());

app.get('/', (req, res) => {
    logger.info("recieved get to /")
    res.send('ok')
});

const port = 3000;

const server = app.listen(port, err => {
  if (err) {
    console.log(err);
  } else {
    console.log(`Running on port ${port}`);
  }
});
module.exports = server

这是我的测试:

const request = require('supertest')

describe('loading express', () => {
    let server;
    process.env.NODE_ENV = 'test'
    beforeEach(() => {
        delete require.cache[require.resolve('../server')]; // clear the cache of server instance
        server = require('../server')
    })
    afterEach((done) => {
        server.close(done)
    })
    it('responds to /', (done) => {
        request(server)
            .get('/')
            .expect(200, done)
    })
    it('404 everything else', (done) => {
        request(server)
            .get('/foo/bar')
            .expect(404, done)
    })
})

我的测试总是返回:

0 passing (1s)
  2 failing

  1) loading express
       responds to /:
     Error: expected 200 "OK", got 426 "Upgrade Required"
      at Test._assertStatus (node_modules\supertest\lib\test.js:268:12)
      at Test._assertFunction (node_modules\supertest\lib\test.js:283:11)
      at Test.assert (node_modules\supertest\lib\test.js:173:18)
      at localAssert (node_modules\supertest\lib\test.js:131:12)
      at C:\Users\0024620\Desktop\dev-p\rank\node_modules\supertest\lib\test.js:128:5
      at Test.Request.callback (node_modules\superagent\lib\node\index.js:728:3)
      at IncomingMessage.<anonymous> (node_modules\superagent\lib\node\index.js:916:18)
      at endReadableNT (_stream_readable.js:1137:12)
      at processTicksAndRejections (internal/process/task_queues.js:84:9)

来自package.json的依赖

{
  "devDependencies": {
    "mocha": "^7.0.0",
    "supertest": "^4.0.2"
  },
  "dependencies": {
    "express": "^4.17.1",
    "@pusher/chatkit-server": "^1.0.4",
    "body-parser": "^1.18.2",
    "express-handlebars": "^3.0.0",
    "cors": "^2.8.5",
    "passport": "^0.4.1",
    "winston": "^3.2.0"
  }
}

【问题讨论】:

  • 我自己试过了,效果很好我刚刚安装了所需的软件包npm i express winston body-parser cors supertest mocha。也许您没有最新版本,您可以检查节点的版本和您的依赖项吗?
  • 添加了package.json,我所有的包都应该是最新版本。 426 Update Required 与节点包版本没有任何关系。 tools.ietf.org/html/rfc7231#section-6.5.15: "...表示服务器拒绝使用当前协议执行请求,但在客户端升级到不同协议后可能愿意这样做。"
  • 注意,只有在单元测试期间我才会收到 426。当我在浏览器中打开页面时,我会收到预期的 200 ok
  • 你能添加app.use((req, res, next) =&gt; { console.log(req.httpVersion); next(); });作为第一个中间件,看看它使用的是什么HTTP版本
  • 没有从内部使用的功能打印。当我在测试套件中或正常启动服务器时都没有。它只是说“在端口 3000 上运行”。控制台登录服务器代码的其他部分打印得很好。

标签: express supertest


【解决方案1】:

您好,答案可以在这里Getting over a 426 upgrade required 找到。看来很多工作PC的3000端口都有问题。

【讨论】: