[英]app.get is undefined (node.js)
在我的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
,我不知道为什么。
在JavaScript文件之外,仅可见分配给module.exports
。 在您的情况下,这是express()
返回值。 没有导出的module.app
。 另外,停止使用module
作为变量名,因为它是注入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;
route.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);
我想说的第一件事是module.exports=...
和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
,原因是express()
没有app
属性。
此外,该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);
导入了register app.get('/register', reg.register);
。
还有一件事情, exports={name:'A'}
不等于module.exports={name:'A'}
,这很简单, exports
只是指向module.exports
的变量链接,改变了exports
链接本身不会更改module.exports
。
在您的app.js中,尝试更多类似的操作:
module.exports = {
app: express()
}
然后,当您执行var module = require('./app')
, module
将包含一个具有app
属性的对象。
请注意,我不知道express()
作用,但我假设它返回的对象上具有get()
函数。
尝试这个
//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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.