Javascript 打字脚本+;摩卡咖啡&x2B;Express-TypeError:app.address不是函数
在将API从ES6转换为TypeScript时,我在尝试对Express REST端点运行单元测试时遇到了这个问题:Javascript 打字脚本+;摩卡咖啡&x2B;Express-TypeError:app.address不是函数,javascript,node.js,typescript,express,mocha.js,Javascript,Node.js,Typescript,Express,Mocha.js,在将API从ES6转换为TypeScript时,我在尝试对Express REST端点运行单元测试时遇到了这个问题: TypeError: Cannot read property 'address' of undefined 我重新安排了加载服务器的代码,但基本上是这样的: setupRoutes(app: Application): void { app.get(`/myRoute`, this.heartbeat); } server.ts 应用程序ts 然后每个控制器至少由s
TypeError: Cannot read property 'address' of undefined
我重新安排了加载服务器的代码,但基本上是这样的:
setupRoutes(app: Application): void {
app.get(`/myRoute`, this.heartbeat);
}
server.ts
应用程序ts
然后每个控制器至少由setupRoutes()
函数组成,看起来像这样:
setupRoutes(app: Application): void {
app.get(`/myRoute`, this.heartbeat);
}
当尝试在Spec文件(仍然是JS)中调用路由时,我已经导入了。/../build/app.JS
和。/../build/server.JS
文件。通过以下方式进入supertest会产生以下结果:
const server = require('../../build/server.js');
const app = require('../../build/app.js');
let supertest=require('supertest')(应用程序)代码>
产生:类型错误:app.address不是函数
let supertest=require('supertest')(app.default)代码>
产生:未捕获类型错误:没有“新建”就无法调用类构造函数应用程序。
测试本身只是ES6,而不是TS。我还不打算将测试转换为TS,现在仍然希望为它们使用ES6。您必须将http.Server或Express应用程序传递给超级测试,您的应用程序(const-app=require('../build/app.js');
)只是一个包装类
您需要传递给supertest
的是appInstance.app
我的建议是:
将应用程序中的express实例公开:
export default class App {
constructor(controllers) {
this.app = express();
this.initControllers(controllers);
}
initControllers(controllers) {
controllers.forEach((controller) => {
controller.setupRoutes(this.app);
});
}
// express instance getter
getExpressInstance(): Application {
return this.app;
}
}
然后,在服务器.ts
中,您必须导出应用程序实例:
import App from './app';
...bunch of imports...
const app = new App([..., new Controller()]);
export default app;
最后,在您的supertest
文件中:
const AppInstance = require('../../build/server.js');
// const app = require('../../build/app.js'); <----- remove unused import
let supertest = require('supertest')(AppInstance.getExpressInstance());
const-AppInstance=require('../../build/server.js');
//const app=require('../../build/app.js');你错过出口了吗?我在服务器中未看到导出。ts@sparrowts实际上只是一个方便的加载器,它用一组要加载的控制器实例化应用程序,因为我必须先导入,然后手动加载。非常感谢!我全神贯注地想看看该怎么办。我的REST API测试现在又开始工作:)
const AppInstance = require('../../build/server.js');
// const app = require('../../build/app.js'); <----- remove unused import
let supertest = require('supertest')(AppInstance.getExpressInstance());