Moleculer Demo启动Docker Compose报错:Service name can't be empty!
问题:Moleculer微服务容器启动失败,报Service name can't be empty错误
执行Moleculer教程第7步时,创建docker-compose.yml并启动服务后,gateway、email、movies三个容器无法启动,报错信息如下:
Service name can't be empty! Maybe it is not a valid Service schema. Maybe is it not a service schema? { schema: {} } [2023-03-17T10:15:09.936Z] ERROR node-movies/BROKER: Failed to load service '/app/services/movies.service.js' { ServiceSchemaError: Service name can't be empty! Maybe it is not a valid Service schema. Maybe is it not a service schema? at Service.parseServiceSchema (/app/node_modules/moleculer/src/service.js:98:10) at new Service (/app/node_modules/moleculer/src/service.js:64:20) at ServiceBroker.createService (/app/node_modules/moleculer/src/service-broker.js:834:14) at ServiceBroker.loadService (/app/node_modules/moleculer/src/service-broker.js:799:16) at _.uniq.forEach.f (/app/node_modules/moleculer/src/runner.js:438:50) at Array.forEach (<anonymous>) at MoleculerRunner.loadServices (/app/node_modules/moleculer/src/runner.js:438:25) at MoleculerRunner.startBroker (/app/node_modules/moleculer/src/runner.js:510:8) at Promise.resolve.then.then.then.then (/app/node_modules/moleculer/src/runner.js:529:21) at process._tickCallback (internal/process/next_tick.js:68:7) code: 500, type: 'SERVICE_SCHEMA_ERROR', data: { schema: {} }, retryable: false } [Runner] Service name can't be empty! Maybe it is not a valid Service schema. Maybe is it not a service schema? { ServiceSchemaError: Service name can't be empty! Maybe it is not a valid Service schema. Maybe is it not a service schema? at Service.parseServiceSchema (/app/node_modules/moleculer/src/service.js:98:10) at new Service (/app/node_modules/moleculer/src/service.js:64:20) at ServiceBroker.createService (/app/node_modules/moleculer/src/service-broker.js:834:14) at ServiceBroker.loadService (/app/node_modules/moleculer/src/service-broker.js:799:16) at _.uniq.forEach.f (/app/node_modules/moleculer/src/runner.js:438:50) at Array.forEach (<anonymous>) at MoleculerRunner.loadServices (/app/node_modules/moleculer/src/runner.js:438:25) at MoleculerRunner.startBroker (/app/node_modules/moleculer/src/runner.js:510:8) at Promise.resolve.then.then.then.then (/app/node_modules/moleculer/src/runner.js:529:21) at process._tickCallback (internal/process/next_tick.js:68:7) code: 500, type: 'SERVICE_SCHEMA_ERROR', data: { schema: {} }, retryable: false } npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! moleculer-demo02@1.0.0 start: `moleculer-runner` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the moleculer-demo02@1.0.0 start script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR! /root/.npm/_logs/2023-03-17T10_15_09_945Z-debug.log
已完成服务编写,示例services/movies.service.js内容:
"use strict"; const movies = [ {id: 1, title: 'Sharknado'}, {id: 2, title: 'Roma'}, ]; module.exports = { name: "movies", actions: { listAll(ctx) { return Promise.resolve({ movies: movies }); }, getById(ctx) { const id = Number(ctx.params.id); return Promise.resolve(movies.find(movie => movie.id === id )); }, create(ctx) { const lastId = Math.max(...movies.map(movie => movie.id)); const movie = { id: lastId + 1, ...ctx.params.payload, }; movies.push(movie); this.broker.emit("movie.created", movie); return Promise.resolve(movie); } }, };
docker-compose.yml内容:
version: '3.7' services: rabbitmq: image: rabbitmq:3.7-alpine gateway: build: context: . image: service-gateway env_file: .env environment: NODEID: "node-gateway" SERVICES: gateway PORT: 3000 ports: - "3000:3000" depends_on: - rabbitmq email: build: context: . env_file: .env environment: NODEID: "node-email" SERVICES: email depends_on: - rabbitmq movies: build: context: . env_file: .env environment: NODEID: "node-movies" SERVICES: movies depends_on: - rabbitmq
原因分析
- Docker镜像未正确复制服务文件:Dockerfile未将本地
services/目录复制到容器内的/app/services/路径,导致Moleculer Runner找不到服务文件,加载到空schema - 服务文件语法异常:服务文件中存在转义的
"字符,而非正常双引号,导致Node.js无法正确解析模块导出内容,最终返回空对象 - 服务路径与加载规则不匹配:
SERVICES环境变量指定的服务名称对应的文件路径不符合Moleculer Runner的默认扫描逻辑
解决办法
1. 修正Dockerfile,确保复制服务文件
创建或修改项目根目录下的Dockerfile,添加复制服务目录的指令:
FROM node:12-alpine WORKDIR /app # 复制依赖文件并安装 COPY package*.json ./ RUN npm install --production # 复制服务文件和配置文件到容器 COPY services/ ./services/ COPY moleculer.config.js ./ # 启动服务 CMD ["npm", "start"]
2. 修复服务文件的语法问题
检查所有服务文件(如movies.service.js、email.service.js、gateway.service.js),确保所有引号为正常双引号("),替换所有"为",修正后的代码参考上面的示例。
3. 验证服务配置匹配性
- 确保每个服务文件中的
module.exports.name与docker-compose.yml中对应服务的SERVICES环境变量值完全一致(如movies对应movies.service.js) - 如果服务文件不在默认的
services/目录,需在moleculer.config.js中配置servicePath参数,或在启动命令中指定路径
4. 重新构建镜像并启动服务
执行以下命令重新构建镜像并启动容器:
docker-compose build docker-compose up
内容的提问来源于stack exchange,提问作者qg_java_17137
相关产品推荐
相关产品推荐

