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方法呢?


9 回复

根据你描述的情况,错误的原因在于你在 index.js 文件中尝试直接调用 app.js 中的 exports 方法时,实际上没有正确地访问到该方法。让我们来逐步分析并提供解决方案。

问题分析

在你的 app.js 文件中,你定义了如下导出:

exports.test = function() {
    console.log("test");
};

而在 index.js 文件中,你尝试这样导入和调用:

var app = require('../app').test();

这里存在两个主要问题:

  1. 错误的导入方式require('../app') 返回的是一个对象(即 app.js 导出的内容),而不是 app.js 本身。
  2. 立即执行问题:你试图直接调用 .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.jstest 方法。正确的调用方式如上所示。

其他注意事项

  • 确保路径 '../app' 是正确的,相对于 index.js 的位置。
  • 如果 app.js 中有其他逻辑依赖于 require 加载的顺序,你可能需要确保所有依赖都已正确加载。
回到顶部