快速发布请求请求:将标头发送给客户端后无法设置标头

时间:2019-09-28 16:03:22

标签: javascript mysql node.js express

我刚接触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”,   errno:1064,   sqlMessage:    “您的SQL语法有误;检查与您的MariaDB服务器版本相对应的手册,以在\'NULL附近使用正确的语法, \'dqdd \'\'在第一行',   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'))

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

1 个答案:

答案 0 :(得分:0)

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

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