В настоящее время я настраиваю сервер 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;
Я пытался правильно экспортировать модули и импортировать их снова, но это не сработало.
Вы импортируете server.js
в account.js
, а затем импортируете account.js
в server.js
, что создает Circular-Dependency
Circular-Dependencies
возникают, когда два или более модулей прямо или косвенно зависят друг от друга, создавая цикл. В вашем случае это произошло.
Решения
authenticateToken
, pool
, JWT_SECRET
, saltRounds
, а затем импортировать его в account.js
.эй, Субда, спасибо за твой ответ, это сработало! :-)
Рада помочь. Пожалуйста.
У вас есть циклическая зависимость. Переместите
authenticateToken
в отдельный файл/модуль и импортируйте туда, где это необходимо.