我正在尝试使用其他文件中的函数来使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
答案 0 :(得分:1)
TL;博士
您有循环依赖问题。 server.js
需要users.js
而users.js
需要server.js
。
nodeJS模块的工作方式,require()
调用加载文件,并在将其包装到函数中后执行它,传递模块,导出和其他一些参数。即使在文件执行完成之前,模块名称的模块/导出也已缓存。执行后,文件中的代码最终会分配与module.exports
或exports
上的键相关联的各种对象。
现在,在您的情况下,执行从server.js
开始,第2行需要users.js
。控件转到users.js
,在第3行再次需要server.js
然后尝试调用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);`
虽然第二个选项也可以,但我强烈建议使用第一个选项。
答案 1 :(得分:0)
module.exports
它是从require()调用返回的对象引用。
exports
只是一个便利变量,因此模块作者可以编写更少的代码
阅读reference source文章。您将对创建自己的模块和使用节点有更好的理解。