node.js - 请求主体在 super 测试中未定义

标签 node.js express chai supertest

我正在使用 supertest 测试 Express API。我正在尝试将主体参数传递到测试中,如下面的代码片段所示,但由于我收到主体参数未定义的错误消息,因此主体参数似乎未正确传递。

使用命令 mocha --recursive 运行测试会返回以下错误:

Cannot read property 'email' of undefined

<小时/>

下面是文件 email-suite.js 中引用 supertest 的代码

'use strict';
var express = require("express");
var bodyParser = require('body-parser');
var mongoose = require("mongoose");

var app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
var supertest = require("supertest");
var chai = require("chai");
var should = chai.should();

var api = require("../server.js");

describe("Email Module", function() {
    this.timeout(25000);

    before(function(done){
        mongoose.createConnection(/* connectionstring */);

        mongoose.connection.on('open', function(err) {
            if(err) console.log(err);
            console.log('connected to server');
        });

        done();
    });

    it("Check Email Count", function(done) {
        var body = { email: "email@email.com" };

        supertest(api)
            .post("/emailCount")
            .set('Accept', 'application/json')
            .send(body)  // body is undefined
            .expect(200)
            .expect('Content-Type', /json/)
            .end(function(err, res) {
                if(err) return done(err);
                res.body.count.should.equal(2);
                done();
            });
    });
});
<小时/>

以下是文件 email-api.js 中的代码

'use strict';
var express = require("express");
var bodyParser = require('body-parser');
var router = express.Router();
var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

router.post('/emailCount', function(req, res) {
    var email = req.body.email; // req.body is undefined
}

module.exports = router;
<小时/>

下面是文件 server.js 中的代码

var express = require("express");
var app = express();

app.set("port", process.env.PORT || 3000);

var router = require("./user/email-api");

app.use('/', router);

app.listen(app.get("port"), function() {
    console.log("App started on port " + app.get("port"));
});

module.exports = app;

最佳答案

body-parser始终放在express object之后和主服务器文件中的每个路由之前

 var app = express();
 app.use(bodyParser.json());
 app.use(bodyParser.urlencoded({extended: true}));

//路由器任务从这里开始

否则总是会得到未定义,因为首先调用路由器,然后解析主体。

关于node.js - 请求主体在 super 测试中未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39470566/

相关文章:

javascript - mysql2返回值困惑

node.js - Node.js 中 API 的异步调用模式

javascript - 如何使用 Mocha/Chai/Protractor 单击复选框

javascript - 如何使用 Mocha/Chai 检查文件名是否包含字符串?

javascript - Chai 无法读取 null 的属性 'should'

javascript - CSS 和 Javascript 文件未加载到我的根文件夹中的 HTML 文件中 - Openshift

Node.js + Socket.io + Redis 应用程序通过 PM2,内存占用较大

javascript - ReactJS onclick 向另一个元素添加或删除类

javascript - 类型错误 : Cannot read properties of undefined (reading 'prototype' ) React Typescript + Express

node.js - 引用错误 : DATABASE_URL is not defined when trying to connect to heroku postgres db using Sequelize