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);就进不到方法,求破解


3 回复

Nodejs supertest测试get能访问,post不能访问

如果你在使用 supertest 测试你的 Node.js 应用时遇到 GET 请求可以正常访问,但 POST 请求无法进入处理函数的问题,可能是由于以下几个原因导致的:

  1. 路由配置问题:确保你正确地配置了 POST 路由。
  2. 请求数据格式问题:POST 请求可能需要发送一些数据,如果这些数据没有正确发送,服务器端的 POST 处理函数可能不会被触发。
  3. 中间件问题:某些中间件可能会影响 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();
            });
    });
});

解释

  1. 中间件配置:确保你已经在应用中配置了 body-parser,以便能够正确解析 POST 请求的请求体。
  2. 请求体发送:在测试 POST 请求时,需要通过 .send() 方法发送请求体数据。
  3. 错误处理:确保在测试完成后调用 done() 函数来结束测试。

通过以上步骤,你应该可以解决 GET 请求成功但 POST 请求不成功的问题。

回到顶部