Почему Express.js res.send(JSONObject.property) приводит к сбою приложения?

#javascript #node.js #json #api #express

#javascript #node.js #json #API #экспресс

Вопрос:

Использование response.send() со свойством объекта JSON приводит к сбою приложения.

 const express = require('express')
const https = require('https')
const app = express()

app.get('/', function(req, res) {

  const url = 'https://api.openweathermap.org/data/2.5/weather?q=Londonamp;appid=myIDamp;units=metric'
  
  https.get(url, function(response) { 
    response.on('data', function(data){
      const weatherData = JSON.parse(data)
      const temp = weatherData.main.temp
      const weatherDescription = weatherData.weather[0].description
      res.send(temp)
    })
  })
})

app.listen(3000, () => {
  console.log('We are up and running... d(-_^)')
})
 

При использовании nodemon сообщение об ошибке bash:

 express deprecated res.send(status): Use res.sendStatus(status) instead at app.js:16:11
_http_server.js:248
    throw new ERR_HTTP_INVALID_STATUS_CODE(originalStatusCode);
    ^

RangeError [ERR_HTTP_INVALID_STATUS_CODE]: Invalid status code: -0.78
    at ServerResponse.writeHead (_http_server.js:248:11)
    at ServerResponse._implicitHeader (_http_server.js:239:8)
    at ServerResponse.end (_http_outgoing.js:763:10)
    at ServerResponse.send (C:pathnode_modulesexpresslibresponse.js:221:10)
    at IncomingMessage.<anonymous> (C:pathapp.js:16:11)
    at IncomingMessage.emit (events.js:311:20)
    at IncomingMessage.Readable.read (_stream_readable.js:512:10)
    at flow (_stream_readable.js:989:34)
    at resume_ (_stream_readable.js:970:3)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  code: 'ERR_HTTP_INVALID_STATUS_CODE'
 

Интересно то, что использование строки заранее или просто использование двух разных свойств JSON работает:

 res.send(''   temp)
 

или

 res.send(weatherDescription   temp)
 

В чем причина сбоя Express / Node? Не могли бы вы объяснить, почему это так?

Заранее спасибо!

Комментарии:

1. Поскольку предполагается, что число является кодом состояния, например 200 (OK), а -0.78 не является допустимым кодом состояния. Вот что говорится в сообщении об ошибке и почему вы, похоже, используете устаревший метод (вероятно, из-за этой двусмысленности он устарел).

Ответ №1:

Смотрите Ссылку на API:

res.send([тело])
Отправляет HTTP-ответ.

Параметр body может быть объектом буфера, строкой, объектом, логическим значением или массивом. Например:

Вы передаете число, которое не является одним из допустимых типов значений.

(Раньше считалось, что передача числа в качестве первого параметра устанавливала код состояния, но теперь эта функциональность устарела, отсюда и ваша первая строка вывода).


Интересно то, что использование строки заранее

someString someNumber выдаст вам строку, которая является одним из допустимых типов значений.

Ответ №2:

Ну, когда вы указываете номер, экспресс res.send() ожидает действительный код состояния. В этом случае вы вводите значение temp -0.78 , которое не является допустимым кодом состояния. Но когда вы указываете a '' или a string или после того, как выражение преобразуется в строку. Это считается допустимым ответом, а не кодом состояния. Надеюсь, это ответ на ваш вопрос.

 let n = "3" 4
console.log(typeof n)
 

попробуйте запустить этот фрагмент. Вы поймете, почему он преобразуется в строку.