Страницы

суббота, 17 марта 2018 г.

WTF with errors in gRPC?

Недавно мне задали вопрос: для чего нужен package-lock.json, я ответил: для того же для чего и npm-shrinkwrap.json - чтобы не было мучительно больно. Вчера обнаружил удивительный диссонанс между версиями 1.8.0 и 1.8.4 модуля gRPC, а именно изменения в процессе создания ошибки, вот от кого никак не ожидал. К примеру, если в версии 1.8.0 ошибка с сообщением 'Invalid name' на сервере предсказуемо превращалась в ошибку в таким же сообщением на клиенте, то в версии 1.8.4 на клиенте то же сообщение об ошибке превращается в '2 UNKNOWN: Invalid name'. WTF?

Для примера я немного изменил код из предыдущего поста на тему обработки ошибок в gRPC:

- server.js:
const grpc = require('grpc')
const path = require('path')
 
const root = path.join(__dirname, 'protos')
const proto = grpc.load({ root, file: 'test.proto' })
 
const server = new grpc.Server()
server.addService(proto.test.Greeter.service, {
  hello: (call, cb) => {
    console.log('req:', call.request)
    if (call.request.name) {
      return cb(null, `Hello, ${call.request.name}!`)
    }
    cb(new Error('Invalid name'))
  }
})
server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure())
server.start()

- client.js:
const grpc = require('grpc')
const path = require('path')
 
const root = path.join(__dirname, 'protos')
const proto = grpc.load({ root, file: 'test.proto' })
 
const client = new proto.test.Greeter('localhost:50051', grpc.credentials.createInsecure())
client.hello({ name: process.argv[2] || '' }, (err, res) => {
  if (err) {
    console.log('err message:', err.message)
    console.log('err entries:', Object.entries(err))
    console.log('err:', err)
  } else {
    console.log('res:', res)
  }
})

Почувствуйте разницу:




А что если бы подобный код был в production без package-lock.json?