当前位置: 首页 > 知识库问答 >
问题:

为什么我不能在快速路线中使用中间件?

杨飞
2023-03-14

我正在创建一个API,所以我想添加一个用户系统并验证对该API的访问。

这将是验证的中间件:

'use strict'

const jwt = require('jwt-simple');
const moment = require('moment');
const config = require('../settings/config');

function isAuth(req, res, next) {
    if (!req.headers.authotization) {
        return res.status(403).send({
            message: `No tiene autorizacion`
        })
    }
    const token = req.headers.authotization.split(" ")[1];
    const payload = jwt.decode(token, user, config.token.secret_token);

    if (payload.exp <= moment().unix()) {
        return res.status(401).send({
            message: 'El token ha expirado'
        })

        req.user = payload.sub;
        next();

    }
}

module.exports = isAuth;

虽然这是一条路线:

    'use strict'
    const express = require('express');
    const router = express.Router();
    const auth = require('../middlewares/auth');

    router.get('/', auth.isAuth, (req, res) => {
        res.status(200).send({
            message: `Tienes acceso`
        })
    })

另一方面,这是我的主要应用程序设置(app.js):

const express = require('express');
const bodyParser = require('body-parser');
const morgan = require('morgan');

const app = express();
const config = require('./config')

// Middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(morgan('dev'));

// Routes variables
const productRouter = require('../routes/product');
const privateRouter = require('../routes/private');

// Routes uses
app.use('/api/product', productRouter);
app.use('/private', privateRouter);

app.listen(config.app.port, err => {
    if (err) throw err;
    console.log(`Server listening on port ${config.app.port}`)
})

module.exports = app;

我得到这个错误:

D:\api rest\node\u modules\express\lib\router\route。js:202抛出新错误(msg)^

错误:路由。get()需要一个回调函数,但在路由上得到了一个[object Undefined]。[as get](D:\api rest\node\u modules\express\lib\router\route.js:202:15)at函数。原型。[as get](D:\api rest\node\u modules\express\lib\router\index.js:510:19)位于对象。(D:\api rest carlos azaustre\routes\private.js:6:8)位于模块_在对象处编译(internal/modules/cjs/loader.js:959:30)。模块_扩展。。模块处的js(internal/modules/cjs/loader.js:995:10)。在函数处加载(内部/modules/cjs/loader.js:815:32)。模块_在模块处加载(内部/modules/cjs/loader.js:727:14)。require(internal/modules/cjs/loader.js:852:19)at require(internal/modules/cjs/helpers.js:74:18)at Object。(D:\api rest carlos azaustre\settings\app.js:15:23)位于模块_在对象处编译(internal/modules/cjs/loader.js:959:30)。模块_扩展。。模块处的js(internal/modules/cjs/loader.js:995:10)。在函数处加载(内部/modules/cjs/loader.js:815:32)。模块_在模块处加载(内部/modules/cjs/loader.js:727:14)。require(internal/modules/cjs/loader.js:852:19)at require(internal/modules/cjs/helpers.js:74:18)[nodemon]应用程序崩溃-在启动之前等待文件更改。。。

有时会在错误的顶部添加这一行:

(节点:3092)MaxListenerSexceed矮化:检测到可能的EventEmitter内存泄漏。11个退出侦听器

阅读答案后,我编辑我的问题。我只放置了auth,没有放置auth。isAuth和我得到以下错误:

D:\api-rest-carlos-azAustralia\node_modules\Express\lib\router\index.js:458抛出新的TypeError('Router.use()需要一个中间件函数,但得到了一个'gettype(fn))^

类型错误:路由器。use()需要一个中间件函数,但在函数处获得了一个对象。在函数中使用(D:\api rest\node\u modules\express\lib\router\index.js:458:13)。(D:\api rest\node\u modules\express\lib\application.js:220:21)位于数组中。函数的forEach()。在对象上使用(D:\api rest\node\u modules\express\lib\application.js:217:7)。(D:\api rest\settings\app.js:20:5)位于模块_在对象处编译(internal/modules/cjs/loader.js:959:30)。模块_扩展。。模块处的js(internal/modules/cjs/loader.js:995:10)。在函数处加载(内部/modules/cjs/loader.js:815:32)。模块_在模块处加载(内部/modules/cjs/loader.js:727:14)。require(internal/modules/cjs/loader.js:852:19)at require(internal/modules/cjs/helpers.js:74:18)at Object。(D:\api rest carlos azaustre\index.js:3:13)位于模块_在对象处编译(internal/modules/cjs/loader.js:959:30)。模块_扩展。。模块处的js(internal/modules/cjs/loader.js:995:10)。在函数处加载(内部/modules/cjs/loader.js:815:32)。模块_加载(internal/modules/cjs/loader.js:727:14)[nodemon]应用程序崩溃-在启动前等待文件更改。。。

有人知道是什么原因吗?

共有2个答案

魏鸿
2023-03-14

是的,您可以使用以下代码导出函数:模块。导出=isAuth

但是你可以这样调用它:auth。iAuth

假设您正在做类似const auth=要求('./bin/auth.js');之类的事情

auth将是函数本身——不会有isAuth属性。

所以你应该试试这个:

router.get('/', auth, (req, res) => {

你还没有发布你的全部代码,所以这只是一个最好的猜测。

计寒
2023-03-14

module.exports=isAuth;表示只导出函数,而不导出其他内容。这意味着当您执行const auth=要求('.../middlewares/auth');时,auth是实际的函数,而不是包含isAuth作为属性的对象。

所以,做路由器。get('/',auth,(req,res)=

在这里详细了解模块:https://js.evie.dev/modules

 类似资料:
  • 我正在尝试使用文件系统。我的< code>CMakeLists.txt中有< code>-std=c 11 -std=c 1y。GCC版本为4.9.2。然而,我得到了一个错误: 使用的正确方法是什么?

  • 问题内容: 在这里,它说,“注:意思是‘我不关心这个值’”,但是从JavaScript来了,我不明白是什么意思。 我可以打印这些功能的唯一方法是在参数前使用下划线: 没有下划线,我必须这样写,以避免出现任何错误: 我不理解此下划线用法。我何时,如何以及为什么使用这些下划线? 问题答案: 不同的用例有一些细微差别,但是通常下划线表示“忽略此”。 在声明一个新函数时,下划线告诉Swift调用时该参数不

  • 我试图使用Java8Javadoc工具,但它抱怨是一个未知标记: 我看到有一些方法可以禁用doclint,但我真的想知道哪些标签列表被支持(或者为什么这个不支持)。 更多信息在这个问题,这个问题和从这个博文。

  • 我想在spring boot项目中使用“truncate table”语句而不是“delete”语句,因为我需要重置mysql中的自动增量id。这是我的代码: 但有一个例外,就像这样: 其他操作已经工作,如插入、更新或选择,原因是什么,我应该修改什么?

  • 从TensorArray读取: 使用: 问题: 回溯(最近一次调用last):RLU培训中第130行的文件“\main.py”。train()文件“C:\Users\user\Documents\Projects\rl toolkit\rl_training.py”,第129行,在train self中_rpm,赛尔夫。批量大小,自行确定。梯度步数,记录步数b=self。在call result=

  • 问题内容: 我正在尝试将Socket.io与Node.js结合使用,并在路由逻辑内发送到套接字。 我有一个相当标准的Express 3安装程序,其中的server.js文件位于该路由中,然后我的index.js位于一个routes文件夹中,该文件夹导出站点的所有页面/公共可访问功能。因此,它们看起来像: 在server.js中定义的路由如下: 我假设我必须在server.js中创建socket.i