【问题标题】:Node.js - Functions from another file as parameter in a routeNode.js - 来自另一个文件的函数作为路由中的参数
【发布时间】:2021-11-08 23:39:37
【问题描述】:

我正在尝试使我的程序更加模块化,因为它现在非常混乱。但是每次尝试重构我的代码时,我总是会遇到一堆错误和一个无法运行的程序。

我想要做的是创建多个文件,它们有自己的工作量,如果我需要在另一个文件中的某些内容,我基本上可以“借用”该功能。

我现有代码中的示例:

索引.js

//Routers 
const getPostsRouter = require('./routes/getPosts');
app.use('/getPosts', getPostsRouter);

///////////////////////////////////////////////////////////////////////////////////////////////

const authenticateToken = (req, res, next) => {
    const authHeader = req.headers['authorization'];
    const token = authHeader && authHeader.split(' ')[1]
    if (token == null) return res.sendStatus(401);

    jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, user) => {
        if (err) return res.sendStatus(403);
        req.user = user
        next()
    })
}

module.exports = authenticateToken;

然后在我的 getPosts.js 文件中,我希望能够执行类似的操作

const express = require('express');
const router = express.Router();
const db = require('../databaseConnection');
const {authenticateToken} = require('../index')

router.get('/', authenticateToken, async (req, res) => {
        await db.query('SELECT * FROM posts', 
        (err, result) => {
            if (err) {
                res.send({errorMessage: err});
            }
            res.send(result);
        });
    }
}); 

module.exports = router;

但是当我尝试这个时,我总是得到这个错误:“错误:Route.get() 需要一个回调函数,但有一个 [object Undefined]”,它指向“const getPostsRou​​ter = require('./routes/获取帖子');"在 index.js 中

编辑: 问题在于循环依赖!我需要做的就是删除依赖的一侧,现在一切都按预期工作了!

【问题讨论】:

    标签: javascript node.js reactjs express routes


    【解决方案1】:

    删除括号,因为您总是通过默认方式导出 authenticateToken...

    const express = require('express');
    const router = express.Router();
    const db = require('../databaseConnection');
    const authenticateToken = require('../index'); // <---- HERE
    
    router.get('/', authenticateToken, async (req, res) => {
            await db.query('SELECT * FROM posts', 
            (err, result) => {
                if (err) {
                    res.send({errorMessage: err});
                }
                res.send(result);
            });
        }
    }); 
    
    module.exports = router;
    

    【讨论】:

    • 我也试过了,但后来我收到一个错误,上面写着“错误:Route.get() 需要一个回调函数,但得到了一个 [object Object]”,与之前在 index.html 中的行相同。 js
    • @Kevin.J 你是在文件末尾导出路由器吗?
    • 我忘记在我的帖子中包含它,我会编辑它。但是是的,我正在文件末尾导出路由器,请参阅我的编辑。
    • 我认为您应该将下一个参数添加到您传递给 router.get 的函数中,因此而不是 async (req,res)async (req,res, next) 也使 authenticateToken 异步
    • 我尝试应用您的更改,但仍然出现同样的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    相关资源
    最近更新 更多