Nodejs supertest测试get能访问,post不能访问
Nodejs supertest测试get能访问,post不能访问
我有一个路由方法, app.get(’/checkregister’,function (req, res) { console.log(“昵称已注册”); });,测试的时候,用的 request(app).get(’/checkregister’).end(done);能够输出“昵称已注册”,而改为 app.post(’/checkregister’,function (req, res) { console.log(“昵称已注册”); });和用 request(app).post(’/checkregister’).end(done);就进不到方法,求破解
Nodejs supertest测试get能访问,post不能访问
如果你在使用 supertest 测试你的 Node.js 应用时遇到 GET 请求可以正常访问,但 POST 请求无法进入处理函数的问题,可能是由于以下几个原因导致的:
- 路由配置问题:确保你正确地配置了 POST 路由。
- 请求数据格式问题:POST 请求可能需要发送一些数据,如果这些数据没有正确发送,服务器端的 POST 处理函数可能不会被触发。
- 中间件问题:某些中间件可能会影响 POST 请求的处理。
示例代码
假设你有以下 Express 路由配置:
const express = require('express');
const app = express();
// 解析 JSON 数据
app.use(express.json());
app.get('/checkregister', function (req, res) {
console.log("GET 请求 - 昵称已注册");
res.send("GET 请求 - 昵称已注册");
});
app.post('/checkregister', function (req, res) {
console.log("POST 请求 - 昵称已注册");
res.send("POST 请求 - 昵称已注册");
});
module.exports = app;
接下来,使用 supertest 进行测试:
const request = require('supertest');
const app = require('./your-app-file'); // 替换为你的应用文件路径
describe('GET /checkregister', () => {
it('should respond with a status code of 200 and log "昵称已注册"', done => {
request(app)
.get('/checkregister')
.expect(200)
.end((err, res) => {
if (err) return done(err);
expect(res.text).toBe("GET 请求 - 昵称已注册");
done();
});
});
});
describe('POST /checkregister', () => {
it('should respond with a status code of 200 and log "昵称已注册"', done => {
request(app)
.post('/checkregister')
.send({ nickname: 'test' }) // 发送一个对象作为 POST 请求的数据
.expect(200)
.end((err, res) => {
if (err) return done(err);
expect(res.text).toBe("POST 请求 - 昵称已注册");
done();
});
});
});
解释
- GET 请求:使用
.get()方法来模拟 GET 请求。通过.expect(200)检查响应状态码是否为 200,并通过.end()回调函数验证响应文本是否正确。 - POST 请求:使用
.post()方法来模拟 POST 请求,并通过.send()方法发送一个对象作为请求体。同样使用.expect(200)和.end()回调函数来验证响应状态码和响应文本。
通过以上示例代码,你可以看到如何正确地配置和测试 GET 和 POST 请求。如果仍然无法解决问题,请检查是否有其他中间件或配置影响了 POST 请求的处理。
var request = require('supertest').agent(app.listen());
request
.post('/')
.set('Content-Type', 'application/x-www-form-urlencoded')
.set('X-HTTP-Method-Override', 'POST')
.expect('POST', done);
根据你的描述,问题可能是由于请求体(request body)没有正确设置或者路由处理程序中缺少对POST请求的正确处理。以下是一些可能的解决方案和示例代码。
示例代码
首先确保你的 app.post 路由已经正确设置,并且请求体已经被正确解析。通常情况下,你需要使用中间件如 body-parser 来解析请求体。
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
// 使用 body-parser 中间件来解析请求体
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.get('/checkregister', function (req, res) {
console.log("昵称已注册");
res.send("GET 请求成功");
});
app.post('/checkregister', function (req, res) {
console.log("昵称已注册");
res.send("POST 请求成功");
});
module.exports = app;
测试代码
接下来使用 supertest 进行测试:
const request = require('supertest');
const app = require('./your-app-file'); // 替换为你的应用文件路径
describe('GET /checkregister', () => {
it('should respond with status 200 and log "昵称已注册"', (done) => {
request(app)
.get('/checkregister')
.expect(200)
.expect(/昵称已注册/)
.end((err, res) => {
if (err) return done(err);
done();
});
});
});
describe('POST /checkregister', () => {
it('should respond with status 200 and log "昵称已注册"', (done) => {
request(app)
.post('/checkregister')
.send({ nickname: 'example' }) // 发送一个示例数据
.expect(200)
.expect(/昵称已注册/)
.end((err, res) => {
if (err) return done(err);
done();
});
});
});
解释
- 中间件配置:确保你已经在应用中配置了
body-parser,以便能够正确解析 POST 请求的请求体。 - 请求体发送:在测试 POST 请求时,需要通过
.send()方法发送请求体数据。 - 错误处理:确保在测试完成后调用
done()函数来结束测试。
通过以上步骤,你应该可以解决 GET 请求成功但 POST 请求不成功的问题。

