Я новичок в nodeJS, и я хочу показать тело результата моего запроса в браузере, используя экспресс, но мой код выдает такую ​​ошибку, я пытаюсь использовать array.push (), но тоже не работает

< Сильный > ОШИБКА

node:_http_outgoing:576
    throw new ERR_HTTP_HEADERS_SENT('set');
    ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:371:5)
    at ServerResponse.setHeader (node:_http_outgoing:576:11)
    at ServerResponse.header (C:\xampp\htdocs\#masgalih\tt\node_modules\express\lib\response.js:771:10)
    at ServerResponse.send (C:\xampp\htdocs\#masgalih\tt\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (C:\xampp\htdocs\#masgalih\tt\node_modules\express\lib\response.js:267:15)
    at ServerResponse.send (C:\xampp\htdocs\#masgalih\tt\node_modules\express\lib\response.js:158:21)
    at Request._callback (C:\xampp\htdocs\#masgalih\tt\index.js:12:24)
    at Request.self.callback (C:\xampp\htdocs\#masgalih\tt\node_modules\request\request.js:185:22)
    at Request.emit (node:events:390:28)
    at Request.<anonymous> (C:\xampp\htdocs\#masgalih\tt\node_modules\request\request.js:1154:10) {
  code: 'ERR_HTTP_HEADERS_SENT'
}

КОД

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

app.get('/getdata', (req, res) => {
    if (req.query.id !== undefined && req.query.id !== '') {
        request('http://localhost/myApi/index.php?id=' + req.query.id, (err, response, body) => {
            return res.send({
                status: 200,
                data: body
            })
        })
    }

    return res.send({
        status: 400,
        msg: 'Parameter invalid'
    })
})

app.listen(2000)
3
Galih Sukristyan Saputra 27 Ноя 2021 в 07:47
2
Вам не хватает «еще»?
 – 
John
27 Ноя 2021 в 07:56

1 ответ

Лучший ответ

В app.get('/getdata'); есть два разных res.send();. Само по себе это нормально, но происходит следующее: когда функция в app.get('/getdata'); запускается, она сначала проверяет этот оператор if. Если if ложно, он пропускает сразу и все работает нормально.

Но что, если утверждение if верно? Итак, код внутри оператора запускается и отправляет request по указанному URL-адресу и ожидает ответа. Однако пока он ждет, JavaScript продолжает выполнение вашего кода, потому что JavaScript асинхронный .

Таким образом, выполняется второй res.send(), но затем получается ответ на request, и поэтому отправляется второй (первый в хронологическом порядке) res.send(), который вот почему ошибка говорит о том, что вы пытаетесь установить заголовки (основная информация в запросе nodejs) после того, как вы просто отправили его клиенту.

Вместо этого код должен работать только на одном или другом, а не на обоих. Мы можем добиться этого, поместив второй res.send() в else, что означает, что он выполняется, только если оператор if ложен. Так что-то вроде этого:

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

app.get('/getdata', (req, res) => {
    if (req.query.id !== undefined && req.query.id !== '') {
        request('http://localhost/myApi/index.php?id=' + req.query.id, (err, response, body) => {
            return res.send({
                status: 200,
                data: body
            })
        })
    } else {

        return res.send({
            status: 400,
            msg: 'Parameter invalid'
        })
    }
})

app.listen(2000)
2
charlie-map 27 Ноя 2021 в 08:03
О, я вижу, я новичок в nodejs, я думаю, что этот код работает так же, как PHP
 – 
Galih Sukristyan Saputra
27 Ноя 2021 в 08:23