繁体   English   中英

TypeError:fn不是函数。 module.exports中两个函数之间的区别

[英]TypeError: fn is not a function. Difference between two functions in module.exports

我正在尝试使用其他文件中的函数来使asyn / await包装为路由。 细节:

  • 一切都没有包装功能
  • 具有时间的第二个功能可以与类似的导出代码一起正常工作
  • 当位于用户文件中时,自动换行功能可以正常工作

问题:我错过了什么,如何使包装文件从服务器文件中工作? 感谢您提前提示。

server.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;

users.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()调用加载文件,并在将其包装到函数中,将其传递给模块,导出和其他一些参数后执行。 甚至在文件执行完成之前,就已经为模块名称缓存了模块/导出。 执行后,在文件中的代码最终分配与键相关的各种对象module.exportsexports

现在,在你的情况下,执行从开始server.js需要users.js第2行的控制传递给users.js需要server.js再次上线3.然后试图调用server.asyncWrap ,但只能将key分配给server.js第14行。 该文件的控件仍在第2行被阻止。因此,访问键将返回undefined(这不是函数)。

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

一个)您可以以没有循环依赖的方式设计代码。 也许通过将asyncWrap函数移动到其他地方的帮助文件中。

2)您可以将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);`

尽管第二个选项也可以使用,但我强烈建议您使用第一个选项。

module.exports是从require()调用返回的对象引用。 exports仅仅是一个方便的变量,因此模块作者可以写更少的代码阅读文章。 您将对创建自己的模块和使用节点有更好的了解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM