【问题标题】:Cannot set headers after they are sent to the client ( Nodejs , MongoDb , Express)将标头发送到客户端(Nodejs、MongoDb、Express)后无法设置标头
【发布时间】:2021-03-05 04:09:29
【问题描述】:

我正在尝试学习 Nodejs 和 MongoDb。所以我所做的是创建一个简单的网页,将引号保存到 MongoDb 并检索它。但我无法从 MongoDb 获取数据我收到 Nodejs 错误提示

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the 
client
    at ServerResponse.setHeader (_http_outgoing.js:485:11)
    at ServerResponse.writeHead (_http_server.js:269:21)
    at C:\Hritik\programming\Advanced Web\FirstMern\server.js:18:25
    at processTicksAndRejections (internal/process/task_queues.js:94:5) {    
  code: 'ERR_HTTP_HEADERS_SENT'
}

const express = require('express');
const bodyParser = require('body-parser')
const MongoClient = require('mongodb').MongoClient
const app = express();

MongoClient.connect('mongodb+srv://{Username}:{password}@cluster0.vmmbl.mongodb.net/<dbname>?retryWrites=true&w=majority', { useUnifiedTopology: true })
    .then(client => {

        console.log('Connected to Database')
        const db = client.db('star-wars-quotes')
        app.set('view engine', 'ejs')
        app.use(bodyParser.urlencoded({ extended: true }))

        app.get('/', (req, res) => {
            res.sendFile('C:/Hritik/programming/Advanced Web/FirstMern' + '/index.html')
            db.collection('quotes').find().toArray()
                .then(results => {
                    res.writeHead(200, { 'Content-Type': 'text/html' });
                    res.render('index.ejs', { quotes: results })
                    res.end();
                })
                .catch(error => console.error(error))
        });
        app.post('/quotes', (req, res) => {
            db.collection('quotes').insertOne(req.body, (err, result) => {
                if (err) return res.end();
                console.log('saved to database')
                res.redirect('/')
            })
        });
        app.listen(3000, function() {
            console.log('listening on 3000')
        })
    })
    .catch(console.error)

【问题讨论】:

  • 非常好的学习方式。使用cluster0.vmmbl 有人可以尝试登录您的集群。 srv 字符串我相信--tls 已启用,否则密码以明文形式发送。

标签: node.js mongodb express


【解决方案1】:

我发现非常有用的一种方法是,当您发送响应或呈现某些内容时,您可以在此之前放置 return,这样函数就不会在 return 语句示例之后执行:-

return res.status(200).json({success:true, msg:"something good happened"})

【讨论】:

    【解决方案2】:

    Response.prototype.endResponse.prototype.render 都结束请求。您显然不能发送两次标头(每个响应都发送标头),因此请删除res.end()

    【讨论】:

      【解决方案3】:

      在您调用res.render() 之后删除res.end(),因为res.render() 已经结束了请求,并且尝试再次结束它会导致您的警告消息。

      【讨论】:

      • @hritikpawar - 这回答了你的问题吗?如果是这样,您可以通过单击答案左侧的复选标记向社区表明这一点,这也将为您在此处获得一些声誉积分,以遵循正确的程序。
      猜你喜欢
      • 2021-04-07
      • 1970-01-01
      • 2021-10-24
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多