Nodejs [求助] index.js调用app.js的exports方法报错:TypeError: Object #<Object> has no method
Nodejs [求助] index.js调用app.js的exports方法报错:TypeError: Object #<Object> has no method
本人是nodejs新人,问题可能比较低级,请多多指教
我用express构造了一个web app,在app.js里定义了如下:
…
exports.test = function() { console.log(“test”); } …
注:我已经查过app.js里,只有这一处exports,并没有module.exports语句.
然后在routes目录下的index.js文件最开始做如下调用: var app = require(’…/app’).test();
后台抛错:
F:\WorkSpace\ForEveryone\sup\routes\index.js:7 var app = require(’…/app’).test(); ^ TypeError: Object #<Object> has no method 'test’ at Object.<anonymous> (F:\WorkSpace\ForEveryone\sup\routes\index.js:7:29) at Module._compile (module.js:456:26) at Object.Module._extensions…js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.require (module.js:364:17) at require (module.js:380:17) at Object.<anonymous> (F:\WorkSpace\ForEveryone\sup\app.js:5:14) at Module._compile (module.js:456:26) at Object.Module._extensions…js (module.js:474:10) DEBUG: crashing child
node.js:728 throw errnoException(process._errno, ‘kill’); ^ Error: kill ESRCH at errnoException (node.js:540:13) at process.kill (node.js:728:15) at null._onTimeout (C:\Users\admin\AppData\Roaming\npm\node_modules\supervisor\lib\supervisor.js:252:15) at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
请问我哪里错了,是不是index.js不能调用app.js里的exports方法呢?
根据你描述的情况,错误的原因在于你在 index.js
文件中尝试直接调用 app.js
中的 exports
方法时,实际上没有正确地访问到该方法。让我们来逐步分析并提供解决方案。
问题分析
在你的 app.js
文件中,你定义了如下导出:
exports.test = function() {
console.log("test");
};
而在 index.js
文件中,你尝试这样导入和调用:
var app = require('../app').test();
这里存在两个主要问题:
- 错误的导入方式:
require('../app')
返回的是一个对象(即app.js
导出的内容),而不是app.js
本身。 - 立即执行问题:你试图直接调用
.test()
方法,而没有先将这个方法赋值给一个变量或直接调用。
解决方案
正确的做法是分开两步:首先导入 app.js
的导出内容,然后再调用其中的方法。以下是修改后的代码:
修改 index.js
文件
// 正确地导入 app.js 中的 exports 对象
var app = require('../app');
// 然后调用 test 方法
app.test();
示例代码
假设你的项目结构如下:
your-project/
├── app.js
└── routes/
└── index.js
app.js
exports.test = function() {
console.log("test");
};
routes/index.js
var app = require('../app');
app.test();
通过这种方式,你可以确保正确地访问和调用 app.js
中导出的方法。希望这能解决你的问题!
是不是路径错了
var app = require(’./app’).test();
不是路径错了,如果写成var app = require(’./app’).test(); 抛的错是 Error: Cannot find module ‘./app’ …
var app = require(’…/app’);
app.test();
怎么样
这样也是不行的,在app.test();抛同样的错…
<p>我交叉测试了一下。没有问题。Below is code</p> <h3>app.js</h3><pre><code>exports.testFunc = function() { console.log(“test”); } var testFun =require(’./routes/index.js’); app.get(’/test’, function(req, res) { testFun.test(); }); </code></pre> <h3>index.js</h3> <pre><code> appTest = require(’…/app.js’); exports.test = function() { appTest.testFunc(); }</code></pre>
app.test()是函数调用,app.test才是函数复制.
##可以不用这样的,在app.js里面直接定义方法或者变量,在router/xxx.js里面可以直接使用的,如
app.js里面
var mysql = require('mysql');
var app = express();
appPool = mysql.createPool({
host : '127.0.0.1',
user : 'root',
password : 'admin',
port : '8889',
database : 'database1024'
});
在router/index.js里面
exports.index = function(req, res){
appPool.getConnection(function(err, connection) {
connection.query( 'SELECT * FROM user', function(err, rows) {
if (err) throw err;
console.log(rows);
});
connection.release();
res.json('index'+ resultData);
});
}
对JS不太熟,但是这样我测试通过
根据你的描述,问题在于你在 index.js
中尝试通过 require
获取 app.js
模块,并直接调用 .test()
方法。但实际上,require
返回的是整个模块对象,而不是 test
方法本身。
示例代码
app.js
exports.test = function() {
console.log("test");
};
index.js
var app = require('../app');
app.test(); // 正确的方式是这样调用
解释
require('../app')
: 这会加载并返回app.js
文件中的module.exports
对象。- 如果
app.js
中仅使用exports
添加属性或方法,那么require('../app')
将返回一个包含这些属性或方法的对象。 - 你需要先获取该对象,然后才能访问其中的方法。
错误原因
你之前写的 var app = require('../app').test();
是错误的,因为 require('../app')
返回的是一个对象,而你试图直接调用该对象上的 .test()
方法,这会导致错误。
解决方案
确保你在 index.js
中正确地引用和调用 app.js
的 test
方法。正确的调用方式如上所示。
其他注意事项
- 确保路径
'../app'
是正确的,相对于index.js
的位置。 - 如果
app.js
中有其他逻辑依赖于require
加载的顺序,你可能需要确保所有依赖都已正确加载。