繁体   English   中英

app.get是未定义的(node.js)

[英]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.exportsrequire后将导入的对象。 假设有一个名为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM