2016-11-20 64 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'沒有任何意義。 –

相關問題