发送到客户端(Nodejs、MongoDb、Express)后无法设置头



我正在尝试Learning 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:HritikprogrammingAdvanced WebFirstMernserver.js:18:25
at processTicksAndRejections (internal/process/task_queues.js:94:5) {    
code: 'ERR_HTTP_HEADERS_SENT'
}

<Server.js>

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)

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

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

我发现非常有用的一种方法是,当您发送响应或呈现某个东西时,您可以将return放在它之前,这样函数就不会在return语句之后。例如:-

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

最新更新