#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)
попробуйте запустить этот фрагмент. Вы поймете, почему он преобразуется в строку.