在开玩笑测试后杀死或关闭 apollo-server 上的 websocket
Kill or close websocket on apollo-server after jest test
我想知道如何在 jest 测试后关闭 websocket?
目前我有这个:
packages.json
"scripts": {
"test": "jest --watchAll"
},
"jest": {
"globalSetup": "./tests/jest/globalSetup.js",
"globalTeardown": "./tests/jest/globalTeardown.js"
},
server.js
...
const server = new ApolloServer({
typeDefs,
resolvers,
context(request) {
return {
prisma,
request,
}
},
})
export { server as default }
globalSetup.js
require("@babel/register")
const server = require("../../server").default
// console.log(server)
module.exports = async () => {
global.httpServer = await server.listen({ port: 4000 })
}
globalTeardown.js
module.exports = async () => {
console.log("stop") // Show stop in the console
await global.httpServer.stop
}
我启动这个命令:
npm 运行 测试
测试已执行,但在手表上,如果我修改一个测试,我会出现此错误:
Error: listen EADDRINUSE: address already in use :::4000
at Server.setupListenHandle [as _listen2] (net.js:1313:16)
at listenInCluster (net.js:1361:12)
at Server.listen (net.js:1449:7)
at /Users/jeremiechazelle/Sites/project/server/node_modules/apollo-server/src/index.ts:128:18
at new Promise (<anonymous>)
at ApolloServer.<anonymous> (/Users/jeremiechazelle/Sites/project/server/node_modules/apollo-server/src/index.ts:123:11)
at Generator.next (<anonymous>)
at /Users/jeremiechazelle/Sites/project/server/node_modules/apollo-server/dist/index.js:18:71
at new Promise (<anonymous>)
at __awaiter (/Users/jeremiechazelle/Sites/project/server/node_modules/apollo-server/dist/index.js:14:12)
Emitted 'error' event on WebSocketServer instance at:
at Server.emit (events.js:316:20)
at emitErrorNT (net.js:1340:8)
at processTicksAndRejections (internal/process/task_queues.js:84:21) {
code: 'EADDRINUSE',
errno: -48,
syscall: 'listen',
address: '::',
port: 4000
}
测试执行后,我查看端口 4000,使用此命令:lsof -i:4000,我总是看到:
端口未关闭...
server.listen
returns 解析为 ServerInfo
对象的 Promise
export interface ServerInfo {
address: string;
family: string;
url: string;
subscriptionsUrl: string;
port: number | string;
subscriptionsPath: string;
server: http.Server;
}
所以你需要调用global.httpServer.server.close()
。
我想知道如何在 jest 测试后关闭 websocket?
目前我有这个:
packages.json
"scripts": {
"test": "jest --watchAll"
},
"jest": {
"globalSetup": "./tests/jest/globalSetup.js",
"globalTeardown": "./tests/jest/globalTeardown.js"
},
server.js
...
const server = new ApolloServer({
typeDefs,
resolvers,
context(request) {
return {
prisma,
request,
}
},
})
export { server as default }
globalSetup.js
require("@babel/register")
const server = require("../../server").default
// console.log(server)
module.exports = async () => {
global.httpServer = await server.listen({ port: 4000 })
}
globalTeardown.js
module.exports = async () => {
console.log("stop") // Show stop in the console
await global.httpServer.stop
}
我启动这个命令:
npm 运行 测试
测试已执行,但在手表上,如果我修改一个测试,我会出现此错误:
Error: listen EADDRINUSE: address already in use :::4000
at Server.setupListenHandle [as _listen2] (net.js:1313:16)
at listenInCluster (net.js:1361:12)
at Server.listen (net.js:1449:7)
at /Users/jeremiechazelle/Sites/project/server/node_modules/apollo-server/src/index.ts:128:18
at new Promise (<anonymous>)
at ApolloServer.<anonymous> (/Users/jeremiechazelle/Sites/project/server/node_modules/apollo-server/src/index.ts:123:11)
at Generator.next (<anonymous>)
at /Users/jeremiechazelle/Sites/project/server/node_modules/apollo-server/dist/index.js:18:71
at new Promise (<anonymous>)
at __awaiter (/Users/jeremiechazelle/Sites/project/server/node_modules/apollo-server/dist/index.js:14:12)
Emitted 'error' event on WebSocketServer instance at:
at Server.emit (events.js:316:20)
at emitErrorNT (net.js:1340:8)
at processTicksAndRejections (internal/process/task_queues.js:84:21) {
code: 'EADDRINUSE',
errno: -48,
syscall: 'listen',
address: '::',
port: 4000
}
测试执行后,我查看端口 4000,使用此命令:lsof -i:4000,我总是看到:
端口未关闭...
server.listen
returns 解析为 ServerInfo
对象的 Promise
export interface ServerInfo {
address: string;
family: string;
url: string;
subscriptionsUrl: string;
port: number | string;
subscriptionsPath: string;
server: http.Server;
}
所以你需要调用global.httpServer.server.close()
。