首页 > 解决方案 > TypeError:无法解构“request.body”的属性“用户名”

问题描述

我在 router.post 中声明变量并从数据库中检索数据,但它说一个类型错误,它无法解构“request.body”的属性“用户名”,因为它是未定义的。请指教。

这是有问题的文件夹const { username, password } = request.body;

User.js(在路由文件夹下)

const express = require("express");
const router = express.Router();
const mysql = require("mysql");

//connection to database
const connection = mysql.createConnection({
  host: process.env.DATABASE_HOST,
  user: process.env.DATABASE_USER,
  password: process.env.DATABASE_PASSWORD,
  database: process.env.DATABASE,
});

router.get("/", function (request, response) {
  response.render("login.html");
});

router.post("/auth", function (request, response) {

  try {
    const { username, password } = request.body;
    connection.query(
      "SELECT * FROM accounts WHERE username = ? AND password = ?",
      [username, password],
      function (error, results, fields) {
        if (results.length > 0) {
          request.session.loggedin = true;
          request.session.username = username;
          response.redirect("/agenthome");
        } else {
          response.send("Incorrect Username and/or Password!");
        }
        response.end();
      }
    );
  } catch (error) {
    console.log(error);
  }
});

module.exports = router;

应用程序.js

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

const userRoutes= require('./routes/user');

//env configuration
dotenv.config({ path: "./.env" });

app.use("/", userRoutes);

//connection to database
const connection = mysql.createConnection({
  host: process.env.DATABASE_HOST,
  user: process.env.DATABASE_USER,
  password: process.env.DATABASE_PASSWORD,
  database: process.env.DATABASE,
});

// check database connection err
connection.connect(function (err) {
  if (err) {
    return console.error("error: " + err.message);
  }
  console.log("Connected to the MySQL server.");
});

//prevent course errors
app.use((res, req, next) => {
  res.header("Access-Control-Allow-Origin", "*");
  res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept, Auhtorization"
  );
  if (req.method === "OPTIONS") {
    res.header("Access-Control-Allow-Methods", "PUT, POST, PATCH, DELETE, GET");
  }
  next();
});

app.use(
  session({
    secret: "secret",
    resave: true,
    saveUninitialized: true,
  })
);
app.use('/assets', express.static('assets')); 

//view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set("view engine", "ejs");

//render HTML files
app.engine('html', require('ejs').renderFile);

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.listen(3000);

标签: node.js

解决方案


尝试采取

app.use("/", userRoutes);

并将其移至底部,之后

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

request.body 可能不正确,因为如果在 bodyparser 中间件之前添加路由,则路由可能不使用 json 格式。


推荐阅读