app.get未定义(node.js)

时间:2016-06-17 03:59:31

标签: javascript node.js express

在我的app.js文件中,我执行以下操作...

var app = module.exports = express();

然后在我的register.js文件中,我使用get以下列方式呈现页面...

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

module.app.get('/register', function (req, res) {
    res.render('register.jade', { title: 'register' });
});

但我收到get cannot be used with app because it is undefined

的错误

如果我将get功能更改为以下内容,一切正常......

exports.register = function (req, res) {
    res.render('register.jade', { title: 'register' });
};

并将我的app.js更改为...

app.get('/register', reg.register);

......它会起作用。

但我希望能够导出app,以便我可以在其他路线中使用它。如何正确导出?

修改

我刚刚意识到要求模块使用var app = require('./app');的正确方法。

我之前提到的路径是错误的。

但现在我收到错误cannot find module ./app,我不明白为什么。

4 个答案:

答案 0 :(得分:1)

只有分配给module.exports的内容才能在该JavaScript文件之外显示。在您的情况下,返回值为express()。没有导出module.app。另外,请停止使用module作为变量名称,因为the globals中的一个注入了JavaScript文件。

最好对服务器脚本做一些更清晰的手动控制,然后在服务器上运行调用所有必需的设置功能:

结构:

project
   |_controllers
   |   |_login.js
   |   |_register.js
   |_routes.js
   |_app.js

controllers / login.js:

/**
 * Login user.
 * @param req - express Request.
 * @param res - express Response.
 * @param next - calls next middleware.
 */
function login(req,res,next){
   res.send("Login!");
}

// exports
module.exports = login;

controllers / register.js:

/**
 * Register user.
 * @param req - express Request.
 * @param res - express Response.
 * @param next - calls next middleware.
 */
function login(req,res,next){
   res.send("Register!");
}

// exports
module.exports = register;

routes.js

/**
 * routes module.
 */
var routes = {};

/**
 * Setup app routes.
 * @param app - Express app instance.
 */
routes.setup = function setup(app){
   app.post('/register',require('./controllers/register'));
   app.post('/login',require('./controllers/login'));
}

// exports
module.exports = routes;

app.js:

var express = require('express');
var routes= require('./routes');

// init app
var app = express();

// setup routes
routes.setup(app);

// start server
app.listen(8080);

答案 1 :(得分:1)

我想说的第一件事就是module.exports=...exports.something=...做的事情。 module.exports是在require之后导入的对象。我们假设有一个名为X.js的文件:

var A = {
    name:'A'
};
module.exports = A;

现在我们可以在其他文件中导入它,假设我们有一个名为Y.js的文件:

var A = require('pathToX/X');
console.log(A.name);

因此,在您的代码module.exports = express();中,您导出的对象是" express()"本身。您应该以这种方式在其他文件(例如,您的register.js文件)中使用它:

var module = require('../app');
module.get('/register', function (req, res) {
    res.render('register.jade', { title: 'register' });
});

也就是说,当您致电require('../app')时,您获得的是express()。因此,您的代码module.app.get等于express().app.get,因为app中没有express()属性。

此外,module是在节点js中预定义的,请不要将其用作变量名,您可以将register.js文件更改为

var app = require('../app');
app.get('/register', function (req, res) {
    res.render('register.jade', { title: 'register' });
});

这是真的:exports===module.exports,因此您在代码app.get('/register', reg.register);中以正确的方式导入寄存器。

还有一件事,exports={name:'A'}不等于module.exports={name:'A'},这非常简单,exports只是module.exports的变量链接,更改了exports链接本身不会改变module.exports

答案 2 :(得分:0)

在app.js中,尝试更类似的内容:

info:             _    _____   _ ___ ___
info:            /_\  |_  / | | | _ \ __|
info:      _ ___/ _ \__/ /| |_| |   / _|___ _ _
info:    (___  /_/ \_\/___|\___/|_|_\___| _____)
info:       (_______ _ _)         _ ______ _)_ _
info:              (______________ _ )   (___ _ _)
info:
info:    Microsoft Azure: Microsoft's Cloud Platform
info:
info:    Tool version 0.10.1

然后当您执行module.exports = { app: express() } 时,var module = require('./app')将包含一个具有module属性的对象。

请注意,我不知道app的作用,但我假设它正在返回一个具有express()函数的对象。

答案 3 :(得分:0)

试试这个

//app.js

var express = require('express');

var app = module.exports = express();


//register.js

var module = require('./app.js');

//var http   = require('http');
//var server =  http.createServer(module);


module.get('/register', function(req,res,next) {
    // body...
    console.log("register");

});

//server.listen(1338);