Chai testing TypeError: Converting circular structure to JSON

Chai testing TypeError: Converting circular structure to JSON

我是新手express.js我想测试简单的post并使用tdd机制进行操作。我创建了测试、路由、索引和数据库文件,但是当我尝试测试 POST 方法时,它给了我这个错误。

这是我的 routes/task.js

const express = require('express');
const router = express.Router();

router.post("/api/task", async (req,res) => {
    try {
        const task = await new Task(req.body).save();
        res.send(task);
    } catch (error) {
        res.send(error);
    }
})

这是我的 test/task.js

let chai = require("chai");
const chaiHttp = require("chai-http");
const { send } = require("process");
let server = require("../index");

//Assertion Style
chai.should();

chai.use(chaiHttp);

describe('Tasks API', () => {

        
    /** 
     * Test the POST Route
     */
     describe('POST /api/task', () => {
        it("It should POST a new task", () => {
            const task =  {task: "Wake Up"};
            chai.request(server)
                .post("/api/task")
                .send(task)
                .end((err, response) => {
                    response.should.have.status(201);
                    response.body.should.be.a('string');
                    response.body.should.have.property('id');
                    response.body.should.have.property('task');
                    response.body.should.have.property('task').eq("Wake Up");
                    response.body.length.should.be.eq(1);
                done();
                });
        });
    });
});

这是我的db.js

var sqlite3 = require('sqlite3').verbose()

const DBSOURCE = "db.sqlite"

let db = new sqlite3.Database(DBSOURCE, (err) => {
    if (err) {
      // Cannot open database
      console.error(err.message)
      throw err
    }else{
        console.log('Connected to the SQLite database.')
        db.run(`CREATE TABLE IF NOT EXISTS todo (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            task text
            )`,
        (err) => {
            if (err) {
                // Table already created
                console.log(err);
            }
        });  
    }
});


module.exports = db

这是我的 index.js

const connection = require('./db');
const express = require('express');
const app = express();
const cors = require("cors"); 


const port = process.env.PORT || 8080;

app.use(express.json());
app.use(cors());



app.get('/', (req, res) => {
    res.send('Hello World');

});

app.post('/api/task', (req, res) => {

    res.status(201).send(req);

});




app.listen(port, () => console.log(`Listening on port ${port}...`)); 

module.exports = app;

我尝试做的事情是构建一个测试用例来测试 post 方法。我想我无法建立正确的文件关系。

目前,只要向/api/task发出POST请求,就会出现错误。那是因为 index.js:

中的这些行
app.post('/api/task', (req, res) => {
    res.status(201).send(req);
});

req 参数是循环的,因此不能 JSON 字符串化。

解决方案

routes/task.js中导出router:

const express = require('express');
const router = express.Router();

router.post("/api/task", async (req,res) => {
    try {
        const task = await new Task(req.body).save();
        res.send(task);
    } catch (error) {
        res.send(error);
    }
})

// By adding this line you can export the router
module.exports = router

index.js 中,包含 routes/task.js 文件并将其传递给 app.use(...),同时删除现已过时的 /api/task 路线:

const connection = require('./db');
const express = require('express');
const app = express();
const cors = require("cors");
const taskRoutes = require("./routes/task")


const port = process.env.PORT || 8080;

app.use(express.json());
app.use(cors());

app.get('/', (req, res) => {
    res.send('Hello World');
});

app.use(taskRoutes)

app.listen(port, () => console.log(`Listening on port ${port}...`));

module.exports = app;

这样我们就摆脱了循环结构字符串化,现在测试应该通过了。