Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 打字脚本+;摩卡咖啡&x2B;Express-TypeError:app.address不是函数_Javascript_Node.js_Typescript_Express_Mocha.js - Fatal编程技术网

Javascript 打字脚本+;摩卡咖啡&x2B;Express-TypeError:app.address不是函数

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

在将API从ES6转换为TypeScript时,我在尝试对Express REST端点运行单元测试时遇到了这个问题:

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());