【发布时间】: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) => { console.log(req.httpVersion); next(); });作为第一个中间件,看看它使用的是什么HTTP版本 -
没有从内部使用的功能打印。当我在测试套件中或正常启动服务器时都没有。它只是说“在端口 3000 上运行”。控制台登录服务器代码的其他部分打印得很好。