2016-11-20 81 views
0

我在node.js中新我头疼,因为我不能让如何通过在node.js中新手任务的NodeJS - 路由/文件之间传递数据

我的文件文件/路由之间的数据结构看起来像这样(很简单的流行结构):

ROUTES (folder) 
--form.js 
--test.js 

VIEWS (folder) 
--form.ejs 
--test.ejs 

index.js 
package.json 

index.js文件(标准明确应用程序文件):

var express = require('express'); 
var body_parser = require('body-parser'); 

var form = require('./routes/form.js'); 
var test = require('./routes/test.js'); 

var app = express(); 
app.set('view engine', 'ejs'); 
app.use(body_parser.urlencoded({extended:true})); 

app.use('/', form); 
app.use('/test', test); 

var port = 3700; 
var server_listen_on = app.listen(port, function() 
{ 
    console.log('Server is listening on port: ' + port); 
}); 

form.ejs文件:

<!DOCTYPE html> 
<html> 
<head> 
<title>pole</title> 

</head> 
<body> 

Hi! Put some web address here:</br> 

<form action="/post" method="post"> 
    <input type="text" name="address"> 
    <input type="submit" value="ENTER OR CLICK HERE"> 
</form> 

</body> 
</html> 

test.ejs文件:

<!DOCTYPE html> 
<html> 
<head> 
<title>test</title> 

</head> 
<body> 

    The page you fill in:<br> 
    <%= target %><br> 
    Let us see how it looks like:<br> 


</body> 
</html> 

form.js文件

var express = require('express'); 
var body_parser = require('body-parser'); 
var router = express.Router(); 

router.get('/', function(req, res, next) 
{ 
    res.render('form'); // this is rendering our form - as a start page 
}); 

router.post('/post', function(req, res, next) 
{ 
    var data = req.body.address; // user fill the form (test.ejs file) 
    res.render('test', {target : req.body.address}); // we grab the data that user put in the form and render test page that will show this data 
    module.exports.page = data; // now I want to pass it to other js file - test.js 
}); 





var page = function() 
{ 
    console.log('just for test purpose'); 
}; 

module.exports = router; // right now module.exports is equal to router (express.router). 
// How to pass some more data in it (like above function - page) - something like module.exports = page + router; So I could use page variable in other js file[?] 

test.js文件:

var express = require('express'); 
var request = require('request'); 
var router = express.Router(); 

var req_formjs = require('./form.js'); 

console.log(req_formjs.data); // undefined... [?] how to pass variables from form.js to test.js [?] 

router.get('/', function (req, res, next) 
{ 
    request.get(target, function (err, res, body) // putting target in here (as a url) isn't working... [?] how to pass variable from router.post in form.js to router.get in test.js [?] 
    { 
     if (!err && res.statusCode == 200) 
     { 
      res.render('test', {content : body}); // second render of test.ejs is not working [?] 
     } 
     else 
     { 
      console.log('error'); 
     } 
    }); 
}); 

module.exports = router; 

更简单的(答案),就更好了。代码中包含一些问题 - 以便更好地理解。如果有任何教程或类似的问题(我没有检查,我找不到任何描述),只需粘贴链接,谢谢。

编辑:让我们用更简单的形式更好地理解。问题是如何以最简单的模式将变量传递给其他js文件(没有任何路由只是使用module.exports)。

index.js - 同

form.js

var express = require('express'); 
var body_parser = require('body-parser'); 
var router = express.Router(); 

var preciousData = 'var precious_data - from form.js file'; 

module.exports = 
{ 
    exportsPreciousData : preciousData, 
    router : router 
}; 

test.js

var express = require('express'); 
var request = require('request'); 
var router = express.Router(); 

var requireFormjs = require('./form.js');//({exportsPreciousData : exportsPreciousData}); 


//console.log(requireFormjs.exportsPreciousData); // I guess console.log is faster then module.exports... but 

router.get('/', function(req, res, next) 
{ 
    res.render('welcome', {test : requireFormjs.exportsPreciousData}); 
}); 

// why this doesn't work - I need to use middleware function - could you provide simple working example? 
//(I guessing that even if console.log print data after module.exports machinery I would still need middleware, right?) 

module.exports = router; 

welcome.ejs

<!DOCTYPE html> 
<html> 
<head> 
<title>welcome</title> 

</head> 
<body> 

<%= test %> 

</body> 
</html> 

...为什么它不工作(没有e xpress一切运行良好)?

+0

如果你想做一些处理然后调用一个将数据传递给你的路由器的函数,你想用'data'做什么。如果您需要用于以后的用户请求,那么您需要进行会话。 –

回答

0

你可以导出几乎任何你想要的东西。如果你想通过路由器加上翻页功能,你可以做这样的事情:

module.exports = { 
    router: router, 
    page : page 
}; 

Coversely,如果你试图注入东西放到需要的模块,你会公开一个功能,例如:评论后

module.exports = function(options){ 
    // do something with the options 
    return router; // possibly modified by the options 
}; 

// in your requiring file 

var formRouter = require('./router')({key: 'value'}); 
app.use(formRouter); 

**编辑**

至于试图在路由处理的中间出口,因为你正在做在这里:

router.post('/post', function(req, res, next) 
{ 
    var data = req.body.address; // user fill the form (test.ejs file) 
    res.render('test', {target : req.body.address}); // we grab the data that user put in the form and render test page that will show this data 
    module.exports.page = data; // now I want to pass it to other js file - test.js 
}); 

这样做确实没有意义。首先,模块在运行应用程序的生命周期中仅导出一次。它们本质上是一个Singleton,它在第一个require声明中首次被实例化。因此,以后导出数据意味着您只有最后一篇文章的价值。此外,该处理程序在您的应用程序过程中可能会多次触发(每次发布时)。

如果您告诉我们为什么要在每篇文章中导出该数据,我可能会告诉您解决实际需求的最佳方法。

+0

OP将'data'设置为'post'请求的结果('var data = req.body.address;'),所以这不会起作用。那么你可以得到它的工作,但是如果在几乎同一时间有两个'post'请求,它就没有什么意义,并且会导致问题。更进一步,在'console.log(req_formjs.data);'处仍然是'undefined',因为'console.log'是在任何'post'请求完成之前调用的。 –

+0

好吧,不错。如果你遵循他的所有评论,他确实会问这个问题,但他还*问如何导出多个东西(请参阅他的form.js文件的末尾,他定义了一个页面函数,然后马上询问关于导出路由器页面的内容)。我正在回答这个问题,他完全错过了试图在中间件功能中间导出的问题。感谢您指出这一点,我会在我的答案中添加评论。 – Paul

+0

在nodejs中,'module.exports'是'require'语句返回的对象。所以只要'module.exports'本身没有被覆盖,那么对'module.exports'所做的每一个改变都会在需要该文件的每个地方都可用。所以''req_formjs.data''确实会包含'module.exports.page = data;'所添加的属性,如果**''post'发生后'console.log'完成**。但是这并没有改变这个事实,为此目的使用'export'没有任何意义。 –

相关问题