【问题标题】:Express/node.js debugging error: can't set headers after they are sentExpress/node.js 调试错误:发送后无法设置标头
【发布时间】:2017-05-01 18:47:28
【问题描述】:

我正在尝试创建一个基本的 CRUD 应用程序,但在调试时遇到了麻烦。为了构建我的 CRUD 应用程序,我目前正在使用 node.js、express 和 mongodb。你们能提供的任何帮助都会非常有帮助。

context: 供参考我正在使用这个:

https://zellwk.com/blog/crud-express-mongodb/, currently on "Showing quotes to users" 

我的问题:我的代码出现以下错误,我不确定这是否是由于我的代码放置所致。

Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11)
    at ServerResponse.header (C:\Users\hcqph\gitprojects\crudbeta\node_modules\express\lib\response.js:725:10)
    at ServerResponse.contentType (C:\Users\hcqph\gitprojects\crudbeta\node_modules\express\lib\response.js:558:15)
    at ServerResponse.send (C:\Users\hcqph\gitprojects\crudbeta\node_modules\express\lib\response.js:145:14)
    at done (C:\Users\hcqph\gitprojects\crudbeta\node_modules\express\lib\response.js:962:10)
    at tryHandleCache (C:\Users\hcqph\gitprojects\crudbeta\node_modules\ejs\lib\ejs.js:208:10)
    at View.exports.renderFile [as engine] (C:\Users\hcqph\gitprojects\crudbeta\node_modules\ejs\lib\ejs.js:412:10)
    at View.render (C:\Users\hcqph\gitprojects\crudbeta\node_modules\express\lib\view.js:128:8)
    at tryRender (C:\Users\hcqph\gitprojects\crudbeta\node_modules\express\lib\application.js:640:10)
    at EventEmitter.render (C:\Users\hcqph\gitprojects\crudbeta\node_modules\express\lib\application.js:592:3)

这是我的代码:

app.use(bodyParser.urlencoded({extended: true}))

//set 'ejs' template engine, and default extension is ejs
app.set('view engine', 'ejs')

/* -------- for team documentation --------
=> = replacement for function

app.get hand a GET request (read operation)
------------------------------------------------ */
app.get('/', (req, res) => {
    //serves index.html back to browser
    res.sendFile(__dirname + '/index.html')

    //gets list of trips from mlab.com
    var cursor = db.collection('trips').find()

    //retrieves list of trips retrieved from mlab
    db.collection('trips').find().toArray(function(err, results) {
        if(err) return console.log(err)

        //renders index.ejs
        res.render('index.ejs', {trips:results})
    })
})



/* app.post handles a create request */
app.post('/trips', (req, res) => {
    db.collection('trips').save(req.body, (err, result) =>{
        if (err) return console.log(err)

        console.log('saved to database')
        res.redirect('/') //causes browser to reload
    })
})

是因为我在哪里玩我的 app.set?我怎样才能解决这个问题?

此外,如果我的 res.render 嵌套在文件夹视图中,我是否正确引用了 index.ejs 的 res.render?

【问题讨论】:

  • 很可能是因为在/ 端点中您调用了res.sendFileres.render。您不应为一个请求发送两个响应。

标签: node.js express


【解决方案1】:

您不能为一个请求发送两个响应

删除代码中的一行:

任何一个

  • res.sendFile(__dirname + '/index.html')

  • res.render('index.ejs', {trips:results})

What's happening in your code:

/ get 请求被触发时 node 会将您重定向到 index.html 文件,但下一个会同时执行并 呈现到 index.ejs 文件,这会导致错误,因为该节点已经发送了响应,现在它无法再次发送标头来响应先前的请求。

所以你已经删除了上面提到的一行。

【讨论】:

  • 谢谢!!我删除了 res.sendFile ,它终于可以工作了。非常感谢您的意见。
猜你喜欢
  • 2012-07-25
  • 2018-05-05
  • 2016-12-19
  • 2023-03-12
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多