Я пытаюсь начать использовать nestjs grpc, но безуспешно.
Что я делаю не так?
npm run start
evodesk-auth-nest-grpc@0.0.1 start C:\git\grpc-microservices\evodesk-auth
ts-node -r tsconfig-paths/register src/main.ts
[Nest] 6032 - 2019-1-2 17:30:41 [NestFactory] Starting Nest application...
[Nest] 6032 - 2019-1-2 17:30:41 [InstanceLoader] AppModule dependencies initialized +6ms
[Nest] 6032 - 2019-1-2 17:30:41 [InstanceLoader] AuthModule dependencies initialized +1ms
[Nest] 6032 - 2019-1-2 17:30:41 [NestMicroservice] Nest microservice successfully started +155ms
Method handler signJWT for /EvodeskAuth.Auth/signJWT expected but not provided
Method handler verifyJWT for /EvodeskAuth.Auth/verifyJWT expected but not provided
Я уже пробовал указывать нижний / верхний регистр в имени метода (в общем случае исправление nodejs / grpc с использованием строчной первой буквы).
Попытался добавить имя метода в аннотации @GrpcMethod.
Попытался предоставить AuthModule вместо AppModule в начальной загрузке (возможно, проблема в жизненных циклах? Или имя метода изменилось после компиляции?).
evodesk-auth.proto
syntax = "proto3";
package EvodeskAuth;
service Auth {
rpc signJWT(SignJWTRequest) returns (SignJWTResponse) {}
rpc verifyJWT(JWTRequest) returns (VerifyJWTResponse) {}
}
message Error {
int32 code = 1;
string message = 2;
}
message Account {
string _id = 1;
string login = 2;
string password = 3;
string role = 4;
}
message SignJWTRequest {
string login = 1;
string password = 2;
}
message SignJWTResponse {
string jwt = 1;
Error error = 2;
}
message JWTRequest {
string jwt = 1;
}
message VerifyJWTResponse {
bool allow = 1;
Error error = 2;
}
message JWTObject {
Account account = 1;
}
auth.controller.ts
@Controller()
export class AuthController {
@GrpcMethod('EvodeskAuth')
signJWT(request: EvodeskAuth.SignJWTRequest): Observable<EvodeskAuth.SignJWTResponse> {
return Observable.create((observer) => {
MongoDB.collection('accounts').findOne(
{ login: request.login },
(err: MongoError, result: EvodeskAuth.Account) => {
if (request.password === result.password) {
sign({ account: result }, secretKey, { expiresIn: '10s' }, (jwtError: Error, encoded: string) => {
observer.next({ jwt: encoded });
observer.complete();
});
}
});
});
}
@GrpcMethod('EvodeskAuth')
verifyJWT(request: EvodeskAuth.JWTRequest) {
return Observable.create((observer) => {
verify(request.jwt, secretKey, (jwtErr: Error, decoded: EvodeskAuth.JWTObject) => {
if (jwtErr) {
observer.next({ allow: false, error: { code: 403, message: jwtErr.message } });
} else {
MongoDB.collection('accounts').findOne(
{ _id: decoded.account._id },
(err: MongoError, result: EvodeskAuth.Account) => {
if (decoded.account.password === result.password) {
observer.next({ allow: true });
observer.complete();
}
});
}
});
});
}
}
auth.module.ts
@Module({
imports: [],
controllers: [AuthController],
})
export class AuthModule {}
app.module.ts
@Module({
imports: [AuthModule],
})
export class AppModule {}
main.ts
async function bootstrap() {
const app = await NestFactory.createMicroservice(AppModule, {
transport: Transport.GRPC,
options: {
package: 'EvodeskAuth',
protoPath: join(__dirname, 'evodesk-definitions/proto/evodesk-auth.proto'),
},
});
await MongoClient.connect(dbUrl, (err, client) => {
MongoDB = client.db(dbName);
});
await app.listenAsync();
}
bootstrap();