Post Request express:发送到客户端后无法设置标头

Posted

技术标签:

【中文标题】Post Request express:发送到客户端后无法设置标头【英文标题】:Post Request express: Cannot set headers after they are sent to the client 【发布时间】:2020-01-28 13:51:49 【问题描述】:

我对 Node.js 还很陌生,但遇到了一些问题。 我正在为学习目的开发应用程序,但我遇到了这个问题 错误:在将标头发送到客户端后无法呈现标头。 我不知道如何让它工作

C:\Users\GameDev\Desktop\Portfolio\reciepe\node_modules\mysql\lib\protocol\Parser.js:437 抛出错误; // 重新抛出非 MySQL 错误 ^ 错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头 在 ServerResponse.setHeader (_http_outgoing.js:470:11) 在 ServerResponse.header (C:\Users\GameDev\Desktop\Portfolio\reciepe\node_modules\express\lib\response.js:771:10) 在 ServerResponse.send (C:\Users\GameDev\Desktop\Portfolio\reciepe\node_modules\express\lib\response.js:170:12) 在 ServerResponse.json (C:\Users\GameDev\Desktop\Portfolio\reciepe\node_modules\express\lib\response.js:267:15) 在 C:\Users\GameDev\Desktop\Portfolio\reciepe\routes\route.js:32:20 在查询。 (C:\Users\GameDev\Desktop\Portfolio\reciepe\models\orm.js:9:9) 在查询。 (C:\Users\GameDev\Desktop\Portfolio\reciepe\node_modules\mysql\lib\Connection.js:525:10) 在 Query._callback (C:\Users\GameDev\Desktop\Portfolio\reciepe\node_modules\mysql\lib\Connection.js:491:16) 在 Query.Sequence.end (C:\Users\GameDev\Desktop\Portfolio\reciepe\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:24) 在 Query.ErrorPacket (C:\Users\GameDev\Desktop\Portfolio\reciepe\node_modules\mysql\lib\protocol\sequences\Query.js:90:8)

SQL 错误: 代码:'ER_PARSE_ERROR', 错误号:1064, sql消息: '您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在 \'NULL 附近使用的正确语法, \'dqdd\'\' 在第 1 行', sqlState: '42000', 指数:0, sql: 'INSERT INTO authentication(username,password) VALUES NULL, \'dqdd\''

这是数据库

var mysql = require('mysql');

var con = mysql.createConnection(
  host: "localhost",
  user: "root",
  password: "",
  database:'reciepeapp'
);

module.exports  = con

ORM

  const con = require('./db')

    const orm = 

      insertOne: function (values, cb) 

 const sqlQuery = "INSERT INTO authentication(username,password)  VALUES ?";
    con.query(sqlQuery, [values],function (err, data) 
      if (err) 
        console.log(err)
        cb(err, null);
       else 
        cb(null, data);
      
  );
    ,


    
    module.exports = orm;

这里是 route.js

  const express = require('express');
    const app = express()
    const router = express.Router()
    const bcrypt = require('bcrypt');
    bodyParser = require('body-parser');
    app.use(bodyParser.urlencoded( extended: true ));

    const orm = require('../models/orm')
    router.get('/',(req,res)=>
        res.render('home')
    )
    router.get('/login',(req,res)=>
        res.render('login')
    )
    router.get('/register',(req,res)=>
        res.render('register')
    )
    router.post("/register", function (req, res) 
        values = [
            username = req.body.username,
            password = req.body.password
        ];


        orm.insertOne(values, function(error) 

            if (error) 
                return res.status(401).json(
                    message: 'Not able to add'
                );
            
            return res.json(
                username: values.username,
                password:values.password

            );
        );
    );
    module.exports = router

index.js

const express = require('express');
const app = express()
const bodyParser = require("body-parser");
const indexRouter = require('./routes/route')
const con = require('./models/db')
con.connect(function(err) 
    if (err) 
      return console.error('error: ' + err.message);
    

    console.log('Connected to the MySQL server.');
  );
  app.use(bodyParser.urlencoded( extended: false ));
  app.use(bodyParser.json());
var exphbs  = require('express-handlebars');
console.log(__dirname)
app.use('/',express.static(__dirname + '/public'));
app.engine('handlebars', exphbs());
app.set('view engine', 'handlebars');
app.use('/',indexRouter)
const PORT = 5000;
app.listen(PORT,()=>console.log('it started on 5000'))

我可以知道我的代码有什么问题吗?

【问题讨论】:

你能显示堆栈错误吗?? 尝试将 else 语句放在回调中,而不是直接返回。如果(错误)返回资源; else 返回资源 请不要将修复编辑到您的问题中。就您现在的问题而言,它没有任何意义,也无法作为对他人的参考,因为您将解决方案编辑到了问题中。 是的,你是对的,我保证下次不会这样做 【参考方案1】:

问题出在您的orm 文件中。回调被调用两次(如果err 为真/有一个值),它又调用res.json 两次。尝试更改以下内容

con.query(sqlQuery, [values],function (err, data) 
    if (err) 
      cb(err, null);
     else 
      cb(null, data);
    
);

【讨论】:

感谢您的回答,我替换了,确实错误消失了,但是当我将数据添加到注册表单时,它给了我错误消息:'无法添加' 尝试通过控制台将您的err 记录到orm 以显示错误。 有很多问题..您在route.js 下的值应该是object 而不是arrayvalues = username: req.body.username, password: req.body.password 然后使用con.query('insert into authentication set ?', values, function (err, data) 这将类似于他们提到的在mysql npm 自述文件中。

以上是关于Post Request express:发送到客户端后无法设置标头的主要内容,如果未能解决你的问题,请参考以下文章

从 ui 前端发送 post req 时,Post Request 消息未显示在 App 中

如何发送 POST 请求以响应 node.js Express?

Express request.body 为空

Express框架请求处理机制

如何从 node.js Express 发送 POST 请求?

POSTMAN 中的 POST 请求发送的参数始终未定义为 express 中的值