Nano Hash - криптовалюты, майнинг, программирование

Не удается опубликовать в Sinatra, но получить работы

Я пишу приложение, которое запускает Sinatra в качестве фонового потока для предоставления API.

Я определил маршрут для GET, который работает нормально, но когда я пытаюсь опубликовать, я продолжаю видеть, что он терпит неудачу в WEBrick в том же месте. Ошибка:

[2018-01-18 20:43:05] ERROR NoMethodError: undefined method `each' for nil:NilClass
/Users/atkinsb/.gem/ruby/2.4.0/gems/rack-2.0.3/lib/rack/handler/webrick.rb:90:in `service'
/Users/atkinsb/.rbenv/versions/2.4.2/lib/ruby/2.4.0/webrick/httpserver.rb:140:in `service'
/Users/atkinsb/.rbenv/versions/2.4.2/lib/ruby/2.4.0/webrick/httpserver.rb:96:in `run'
/Users/atkinsb/.rbenv/versions/2.4.2/lib/ruby/2.4.0/webrick/server.rb:290:in `block in start_thread'
::1 - - [18/Jan/2018:20:43:05 GMT] "POST /message HTTP/1.1" 500 320
- -> /message

Я думаю, что проблема в строке 86:

status, headers, body = @app.call(env)

Это всегда возвращает ноль для всех трех переменных, когда я делаю сообщение.

post '/message' do
  ApiServer::Base::SM.message(JSON.parse(request.body.read))
end

Тело поста:

{
  "id": "1",
  "sender": "localhost",
  "action": "SYS_NORMAL_SHUTDOWN",
  "payload": "",
  "ack": "0",
  "date_time": "2018-01-18 08:58:50 +0000"
}

Я отправляю с заголовком в почтальоне:

Content-Type application/json

Я озадачен этим. Любая идея, что я делаю неправильно?

PS. Я забыл упомянуть, что тело json анализируется в маршруте нормально...

Также тело, возвращенное с почты:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
    <HEAD>
        <TITLE>Internal Server Error</TITLE>
    </HEAD>
    <BODY>
        <H1>Internal Server Error</H1>
           undefined method `each' for nil:NilClass
        <HR>
        <ADDRESS>
           WEBrick/1.3.1 (Ruby/2.4.2/2017-09-14) at
           localhost:4567
        </ADDRESS>
    </BODY>
</HTML>
18.01.2018

Ответы:


1

Ну, после всего этого. Кажется, проблема заключалась в том, что мне нужно было вернуть какой-то ответ.

  # Server API route '/message'
  def message(params)
      js = build_message(params['action'], params['payload'])
      write_message_to_file(js)
      '{ "status": "Message Received" }'
  end
18.01.2018
  • Я бы посоветовал вам также использовать halt со статусом, 201 или 202 (это нелюбимые, но полезные коды :), например. halt 202, '{ "status": "Message Received" }'. Это не только позволит избежать ошибок, подобных той, которую вы нашли, но также прояснит, что вы ожидаете вернуть, и что вы не ожидаете, что страница будет возвращена для рендеринга. :provides => :json в качестве условия маршрута помогает внести ясность, также заполняя заголовок Accepts. 19.01.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..