Ошибка: Route.post() требует функции обратного вызова, но в server.js есть [объект не определен]

В настоящее время я настраиваю сервер nodeJS, используя express. У меня есть два внутренних файла: один называется account.js в папке с именем маршруты, а другой — server.js. Я не могу запустить его, потому что он жалуется, что Ошибка: Route.post() требует функции обратного вызова, но получил [объект не определен], конкретно в const accountRoutes = require('./routes/account'); app.use('/account', accountRoutes); (см. код ниже:)

сервер.js

// Import necessary modules: express, http server, socket.io, pg, cors, dotenv, fs
const cors = require('cors');
const dotenv = require('dotenv');
const express = require('express');
const { createServer } = require('http');
const { join } = require('path');
const fs = require('fs');
const { Pool } = require('pg');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');


// Initialize Express application
const app = express();
// Define saltRounds for bcrypt hashing
const saltRounds = 10;
app.use(cors());
const server = createServer(app);
const io = require('socket.io')(server, {
  cors: {
    origin: "http://localhost:3000",
    methods: ["GET", "POST"],
    transports: ['websocket', 'polling'],
    allowedHeaders: ['Access-Control-Allow-Origin'],
    credentials: true
  },
  allowEIO3: true,
  cookie: {
    name: "io",
    path: "/",
    httpOnly: true,
    sameSite: "lax"
  }
});
io.attach(server);
server.listen(3000, () => {
  console.info('server running at http://localhost:3000');
});


const dbConfig = JSON.parse(fs.readFileSync('db_config.json'));
dotenv.config();
const pool = new Pool(dbConfig);

const JWT_SECRET = process.env.JWT_SECRET;

// Make `pool` available to other parts of the application
module.exports = pool;

// Store session IDs
const accounts = {};

// Middleware to parse request bodies
app.use(bodyParser.urlencoded({ extended: true }));
// Serve static files from the 'public' directory
app.use(express.static('public'));
const accountRoutes = require('./routes/account');
app.use('/account', accountRoutes);

// JWT Middleware
const authenticateToken = (req, res, next) => {
  var token = req.headers.authorization.split(' ')[1];
  if (token) {
    return jwt.verify(token, JWT_SECRET, function (err, decoded) {
      if (err) {
        return res.json({
          success: false,
          message: "Failed to authenticate token.",
        });
      }
      req.user = decoded;
      return next();
    });
  }
  return res.unauthorized();
};

// Serve index.html when root URL is accessed
app.get('/', (req, res, next) => {
  res.sendFile(join(__dirname + '/public/index.html'));
});


app.get('/auth', authenticateToken, (req, res) => {
  res.json({ authenticated: true, user: req.user });
});


app.post('/', async (req, res) => {});


module.exports = { authenticateToken, pool, JWT_SECRET, saltRounds };

аккаунт.js

const {authenticateToken, pool, JWT_SECRET, saltRounds } = require('../server.js');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const express = require('express');
const router = express.Router();

// Handle POST request to /logout route
router.post('/logout', authenticateToken, async (req, res) => {
......
});

// Handle POST request to /register route
router.post('/register', async (req, res) => {
.......
});

// Handle POST request to /login route
router.post('/login', async (req, res) => {
.......
});

// Handle POST request to /delete route
router.post('/delete', authenticateToken, async (req, res) => {
.......
});

module.exports = router;

Я пытался правильно экспортировать модули и импортировать их снова, но это не сработало.

У вас есть циклическая зависимость. Переместите authenticateToken в отдельный файл/модуль и импортируйте туда, где это необходимо.

Phil 25.06.2024 09:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы импортируете server.js в account.js, а затем импортируете account.js в server.js, что создает Circular-Dependency

Circular-Dependencies возникают, когда два или более модулей прямо или косвенно зависят друг от друга, создавая цикл. В вашем случае это произошло.

Решения

  1. Вам следует создать отдельный модуль для authenticateToken, pool, JWT_SECRET, saltRounds, а затем импортировать его в account.js.

эй, Субда, спасибо за твой ответ, это сработало! :-)

lunatics975 25.06.2024 17:35

Рада помочь. Пожалуйста.

Subha 25.06.2024 17:41

Другие вопросы по теме