javascript - 为什么我不能在我的快速路由中使用中间件?
问题描述
我正在创建一个 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-carlos-azaustre\node_modules\express\lib\router\route.js:202 throw new Error(msg); ^
错误:Route.get() 需要回调函数,但在 Route 获得了 [object Undefined]。[as get] (D:\api-rest-carlos-azaustre\node_modules\express\lib\router\route.js:202:15) 在 Function.proto。[as get] (D:\api-rest-carlos-azaustre\node_modules\express\lib\router\index.js:510:19) 在对象。(D:\api-rest-carlos-azaustre\routes\private.js:6:8) 在 Module._compile (internal/modules/cjs/loader.js:959:30) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10) 在 Module.load (internal/modules/cjs/loader.js:815:32) 在 Function.Module._load (internal/modules/cjs/loader.js :727:14) 在 Module.require (internal/modules/cjs/loader.js:852:19) 在 require (internal/modules/cjs/helpers.js:74:18) 在 Object. (D:\api-rest-carlos-azaustre\settings\app.js:15:23) 在模块。
有时会在错误顶部添加这一行:
(节点:3092) MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏。11 个退出侦听器 > 添加到 [Bus]。使用emitter.setMaxListeners() 增加限制
阅读答案后,我编辑我的问题。我只放置了auth而不是 auth.isAuth 并且我收到以下错误:
D:\api-rest-carlos-azaustre\node_modules\express\lib\router\index.js:458 throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn)) ^
TypeError:Router.use() 需要一个中间件函数,但在 Function.use (D:\api-rest-carlos-azaustre\node_modules\express\lib\router\index.js:458:13) 处获得了一个对象。(D:\api-rest-carlos-azaustre\node_modules\express\lib\application.js:220:21) 在 Array.forEach () 在 Function.use (D:\api-rest-carlos-azaustre\node_modules\ express\lib\application.js:217:7) 在对象。(D:\api-rest-carlos-azaustre\settings\app.js:20:5) 在 Module._compile (internal/modules/cjs/loader.js:959:30) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10) 在 Module.load (internal/modules/cjs/loader.js:815:32) 在 Function.Module._load (internal/modules/cjs/loader.js :727:14) 在 Module.require (internal/modules/cjs/loader.js:852:19) 在 require (internal/modules/cjs/helpers.js:74: 18) 在对象处。(D:\api-rest-carlos-azaustre\index.js:3:13) 在 Module._compile (internal/modules/cjs/loader.js:959:30) 在 Object.Module._extensions..js (internal /modules/cjs/loader.js:995:10) 在 Module.load (internal/modules/cjs/loader.js:815:32) 在 Function.Module._load (internal/modules/cjs/loader.js:727 :14) [nodemon] 应用程序崩溃 - 在启动前等待文件更改...
有谁知道是什么原因造成的?
解决方案
是的,您使用以下代码导出函数:module.exports = isAuth;
但是然后你像这样调用它:auth.isAuth
假设你正在做类似const auth = require('./bin/auth.js');
或其他的事情
auth
将是函数本身——没有isAuth
属性。
所以你应该试试这个:
router.get('/', auth, (req, res) => {
你还没有发布你的整个代码,所以这只是一个最好的猜测。
推荐阅读
- laravel - 如何在 Web 套接字(推送器)Laravel 中指定时间后向客户端发送事件?
- java - Java线程共享静态变量
- apache-spark - PySpark:AbstractStringBuilder.hugeCapacity 处的 OutOfMemoryError
- bash - 如何在 bash 脚本中记录 lftp 错误
- postgresql - 在不递归的情况下更新触发器中的行
- android - 自定义构建类型的 CrashlyticsUploadDistribution 任务
- php - PHP - 获取参数
- excel - 寻求提高使用循环的宏的速度并将日期转换为其他格式
- amazon-web-services - 运行localstack时遇到错误
- jquery - 手风琴打开时如何将“+”号更改为“-”号?