【问题标题】:How to show result body from node JS request to browser?如何显示从节点 JS 请求到浏览器的结果正文?
【发布时间】:2022-01-04 23:17:15
【问题描述】:

我是 nodeJS 的新手,我想使用 express 向浏览器显示我的请求结果正文,但是我的代码抛出了这样的错误,我尝试使用 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)

【问题讨论】:

  • 您是否缺少“其他”?

标签: javascript node.js arrays


【解决方案1】:

app.get('/getdata'); 中有两个不同的res.send();。这本身没问题,但发生的是当app.get('/getdata'); 中的函数运行时,它首先检查if 语句。如果if 为假,它会直接跳过,一切正常。

但是如果if 声明是真的呢?好吧,语句中的代码运行并将request 发送到指定的URL 并等待响应。在等待期间,JavaScript 会继续运行您的代码,因为 JavaScript 是 asynchronous

所以第二个res.send() 运行,但随后收到了对request 的响应,因此发送了一个second(按时间顺序排列的第一个)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)

【讨论】:

  • 哦,我明白了,我是 nodejs 的新手,我认为代码运行与 PHP 相同
猜你喜欢
  • 2016-07-19
  • 2021-12-09
  • 2019-07-29
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 2019-12-11
  • 2014-05-29
  • 2019-08-26
相关资源
最近更新 更多