【问题标题】:Server side code does not recognize my req.body.variable, stating that it is undefined服务器端代码无法识别我的 req.body.variable,说明它未定义
【发布时间】:2019-05-06 14:18:15
【问题描述】:

我正在创建一个 Web 应用程序,该应用程序应在每次按下特定按钮时将信息从客户端发送到服务器端。当我按下按钮时,终端继续告诉我我试图通过 post 请求正文传递的值是未定义的。

客户端代码(从哪里调用按钮)-

function upvote(elem) {
  var parentID = elem.parentNode.id;
  console.log('Upvote button was clicked' + parentID);

  fetch('/upvote', {     //This is called to pass the body data to server side code
    method: 'post',
    body: JSON.stringify({
      id: parentID
    })
  })
  .then(function(res) {
    if(res.ok) {
      console.log('Click was recorded');
      return;
    }
    throw new Error('Request failed.');
  })
  .catch(function(error) {
    console.log(error);
  });
}

function downvote(elem){
  var parentID = elem.parentNode.id;
  console.log('Downvote button was clicked');

  fetch('/downvote', {  //This is called to pass the body data to server side code
    method: 'POST',
    body: JSON.stringify({
      id: parentID })
  })
  .then(function(res) {
    if(res.ok) {
      console.log('Click was recorded');
      return;
    }
    throw new Error('Request failed.');
  })
  .catch(function(error) {
    console.log(error);
  });
}

setInterval(function() {
  fetch('/ranking', {method: 'GET'})
    .then(function(response) {
      if(response.ok) return response.json();
      throw new Error('Request failed.');
    })
    .then(function(data) {

    })
    .catch(function(error) {
      console.log(error);
    });
}, 1000);

我的 app.js(服务器端代码)--

const bodyParser = require('body-parser');
const mysql = require('mysql');
const path = require('path');
const app = express();

const {getLoginPage, login} = require('./routes/index');    
const {players, questionsPage, upvoteQues, downvoteQues, ranking, addQuestionsPage, addQuestion, deleteQuestion, editQuestion, editQuestionPage} = require('./routes/question');  //All my routes
const port = 5000;

const db = mysql.createConnection ({
    host: 'localhost',
    user: 'root',
    password: '',
    database: ''
});

// connect to database
db.connect((err) => {
    if (err) {
        throw err;
    }
    console.log('Connected to database');
});
global.db = db;

// configure middleware
app.set('port', process.env.port || port); port
app.set('views', __dirname + '/views'); folder to render our view
app.set('view engine', 'ejs'); 
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json()); 
app.use(express.static(__dirname + '/public'));




app.get('/', getLoginPage);
app.get('/questions', questionsPage);
app.get('/add', addQuestionPage);
app.get('/edit/:id', editQuestionPage);
app.get('/delete/:id', deleteQuestion);
app.get('/ranking', ranking);
app.post('/', login);
app.post('/add', addQuestion);
app.post('/edit/:id', editQuestion);
app.post('/upvote', upvoteQues);     //This is then used 
app.post('/downvote', downvoteQues);  //This is then used 


// set the app to listen on the port
app.listen(port, () => {
    console.log(`Server running on port: ${port}`);
});

我的question.js(更多服务器端代码,只是分成不同的文件)

const fs = require('fs');

module.exports = {
    questionsPage:(req, res) =>{
        let query = "SELECT * FROM `Questions` ORDER BY Ranking DESC"; 

        db.query(query, (err, result) => {
            if (err) {
                console.log('Query error');
                res.redirect('/');
            }
            res.render('questions.ejs', {
                title: "JustAsk!",   
                questions: result,
            });
        });
    },
    upvoteQues: (req, res) => {
        console.log(req.body.id);       //Error here
        let updateQuery = "UPDATE `Questions` Ranking = Ranking+1 WHERE QuestionID = '"+ req.body.id + "'"      //Error here
        db.query(updateQuery, (err, result) => {
            if(err){
                console.log('Query error');
                res.redirect('/players')
            }
        });
    },
    downvoteQues: (req, res) =>{
        console.log(req.body.id);      //Error here
        let updateQuery = "UPDATE `Questions` Ranking = Ranking+1 WHERE QuestionID = '"+ req.body.id + "'"       //Error here
        db.query(updateQuery, (err, result) => {
            if(err){
                console.log('Query error');
                res.redirect('/players')
            }
        });
    }, 
    ranking: (req, res) => {
        let query = "SELECT * FROM `Questions` ORDER BY Ranking DESC"; 
        db.query(query, (err, result) => {
            if (err) {
                console.log('Query error');
            }
            res.send(result);
        });
    }
};

【问题讨论】:

  • 您可以尝试将正文作为纯 JS 对象发送,而不是对其进行字符串化吗?

标签: javascript node.js express ejs


【解决方案1】:

正文应该是 JSON 格式,而不是字符串。

 body: JSON.stringify({
      id: parentID 
})

改为:

 body: { id: parentID }

and content type should be 'application/json` like below.

fetch('/url', {
    method: 'POST',
    body: {id: parentID },
    headers: {
            "Content-Type": "application/json",
    }
  })

【讨论】:

  • 感谢您的回答,但没有。另一个错误消失了,但现在它显示“SyntaxError: Unexpected token o in JSON at position 1”。我读错了吗?在服务器端,我仍在使用 req.body.id。这是我应该做的吗?
  • 这是服务器端错误还是客户端错误?告诉我发生在哪一行错误
  • 没关系,我让它工作了!唯一的问题是没有标题部分。代码是这样工作的—— fetch('/downvote', { method: 'POST', body: JSON.stringify({id: parentID }), headers: { "Content-Type": "application/json", } })
猜你喜欢
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多