Express req.ip 返回对象

Express req.ip returning object

我有一个快捷应用程序:

const express = require('express');
const app = express();
const cors = require('cors');
app.use(cors({ optionsSuccessStatus: 200 }));
app.get('/api/whoami', (req, res) => {
    const ipaddress = req.ip;
    res.status(200).json({ ipaddress });
});
    
app.listen(process.env.PORT || 3000);    
module.exports = app;

和一个测试文件:

const chai = require('chai');

const chaiHttp = require('chai-http');
const chaiMatch = require('chai-match');
const { describe, it } = require('mocha');
const server = require('../../server');

const should = chai.should();
const { expect } = chai;
chai.use(chaiHttp);
chai.use(chaiMatch);

describe('/GET /api/whoami', () => {
  it('should return the IP address', (done) => {
    chai.request(server)
      .get('/api/whoami')
      .end((err, res) => {
        res.should.have.status(200);
        res.body.should.be.a('object');
        res.body.should.have.property('ipaddress');
        expect(res.body.ipaddress).should.match(/* very long regex */);
        done();
      });
  });
});

出于某种原因,我一直收到 Uncaught AssertionError: expected Assertion{ __flags: { …(4) } } to match [my very long regex],我没有发现任何人有同样的错误。我怎样才能通过快递获得我的真实IP?或者正确的测试方法是什么?

语法是 expect(something).to.match 而不是 expect(something).should.match。参见 docs。或者,如果您想使用 should,则不需要 expect,因为它的语法是 something.should.match.

因此,解决方法是按如下方式更改您的代码:

expect(res.body.ipaddress).to.match(/* very long regex */);

...或如下:

res.body.ipaddress.should.match(/* very long regex */);

在样式指南中,您可以很好地比较 how to use expect and how to use should

通过混合这两个东西,您使用了 expect(...) 包含 to 之类的 returns 对象,并将其用作 should 的来源,因此 should.match 检查由 expect(...) 返回的对象而不是 IP 地址本身。