javascript - TypeError : fn is not a function. module.exports 中两个函数之间的差异

标签 javascript node.js

我正在尝试使用其他文件中的函数来使 asyn/await 换行以进行路由。详情:

  • 无需换行功能即可正常工作
  • 第二个时间函数与类似的导出代码一起工作正常
  • wrap 函数在位于用户文件中时工作正常

问题:我错过了什么以及如何从服务器文件中进行换行?感谢您提前提示。

服务器.js

let express = require('express');
let userRules = require('./private/routes/users');
app.use('/user', userRules);

function asyncWrap(fn) {
    return (req, res, next) => {
        fn(req, res, next).catch(next);
    };
}
function getCurrentTime() {
  return getDateTime(); //inner func
}
exports.getCurrentTime= getCurrentTime;
exports.asyncWrap = asyncWrap;

用户.js

let express = require('express');
let router = express.Router();
const server = require('../../server');
router.post('/auth', server.asyncWrap(async (req, res, next) => { //this line throws error
    let user = await sql.getUserByEmail(req.body.email); 
    console.log(server.getCurrentTime()+req.body.email+" tried to auth"); // this works
    ...
}));

错误

TypeError: server.asyncWrap is not a function
18|dev     |     at Object.<anonymous> (/var/www/gowarranty/serverNode/forfun/private/routes/users.js:145:54)
18|dev     |     at Module._compile (module.js:571:32)
18|dev     |     at Object.Module._extensions..js (module.js:580:10)
18|dev     |     at Module.load (module.js:488:32)
18|dev     |     at tryModuleLoad (module.js:447:12)
18|dev     |     at Function.Module._load (module.js:439:3)
18|dev     |     at Module.require (module.js:498:17)
18|dev     |     at require (internal/module.js:20:19)
18|dev     |     at Object.<anonymous> (/var/www/gowarranty/serverNode/forfun/private/routes/index.js:11:13)
18|dev     |     at Module._compile (module.js:571:32)
18|dev     |     at Object.Module._extensions..js (module.js:580:10)
18|dev     |     at Module.load (module.js:488:32)
18|dev     |     at tryModuleLoad (module.js:447:12)
18|dev     |     at Function.Module._load (module.js:439:3)
18|dev     |     at Module.require (module.js:498:17)
18|dev     |     at require (internal/module.js:20:19)
18|dev     |     at Object.<anonymous> (/var/www/gowarranty/serverNode/forfun/server.js:5:14)
18|dev     |     at Module._compile (module.js:571:32)
18|dev     |     at Object.Module._extensions..js (module.js:580:10)
18|dev     |     at Module.load (module.js:488:32)
18|dev     |     at tryModuleLoad (module.js:447:12)
18|dev     |     at Function.Module._load (module.js:439:3)
18|dev     |     at Object.<anonymous> (/usr/lib/node_modules/pm2/lib/ProcessContainerFork.js:78:21)
18|dev     |     at Module._compile (module.js:571:32)
18|dev     |     at Object.Module._extensions..js (module.js:580:10)
18|dev     |     at Module.load (module.js:488:32)
18|dev     |     at tryModuleLoad (module.js:447:12)
18|dev     |     at Function.Module._load (module.js:439:3)
18|dev     |     at Module.runMain (module.js:605:10)
18|dev     |     at run (bootstrap_node.js:427:7)
18|dev     |     at startup (bootstrap_node.js:151:9)
18|dev     |     at bootstrap_node.js:542:3

最佳答案

tl;博士

您有循环依赖问题。 server.js需要users.jsusers.js再次需要 server.js

nodeJS 模块的工作方式,require() call 加载文件,并在将其包装在函数中后执行它,向其传递模块、导出和一些其他参数。即使在文件执行完成之前,模块/导出已经缓存了模块名称。执行后,文件中的代码最终会分配与 module.exports 上的键关联的各种对象。或exports .

现在,在您的情况下,执行从 server.js 开始这需要users.js第 2 行。控制权传递到 users.js这需要server.js再次在第 3 行。然后尝试调用 server.asyncWrap ,但该键将仅分配给 server.js 中第 14 行的导出。该文件的控制仍然在第 2 行被阻止。因此访问该键将返回 undefined (这不是一个函数)。

有多种方法可以解决这个问题。

一)您可以以不存在循环依赖的方式设计代码。也许可以将 asyncWrap 函数移动到其他地方的帮助程序文件中。

二)您可以从 server.js 移动第二行和第三行到文件末尾,新文件应如下所示:

let express = require('express');

function asyncWrap(fn) {
    return (req, res, next) => {
        fn(req, res, next).catch(next);
    };
}
function getCurrentTime() {
  return getDateTime(); //inner func
}
exports.getCurrentTime= getCurrentTime;
exports.asyncWrap = asyncWrap;

let userRules = require('./private/routes/users');
app.use('/user', userRules);`

虽然第二个选项也可以,但我强烈建议使用第一个选项。

关于javascript - TypeError : fn is not a function. module.exports 中两个函数之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50170767/

相关文章:

由于 AJAX GET 请求,Javascript undefined variable

javascript - 创建自己的 JQuery 插件

node.js - 使用 Nodejs 连接 MongoDB 时出现 ReplicaSetNoPrimary 和 MongoServerSelectionError 错误

node.js - 未与 Cloud Functions 和 Firestore 建立连接

javascript - 要转移正在运行的 Node 项目,我需要了解什么?

javascript - NodeJS [].forEach 未定义

javascript - 是否可以制作带有线条背景的 Canvas 或不是矩形的 Canvas ?

javascript - PageObjects + 非 Angular 页面 - 如何加入它们?

单击时 JavaScript 按钮文本 innerHTML 不更改

javascript - 如何实现 Punch Autoprefixer 预处理器?