在我的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
,我不明白为什么。
答案 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);