浏览器刷新数据的重复 – Nodejs

我正在使用Mustache和Nodejs将选项列表加载到我的网站上的下拉框中。 每次刷新页面时,都会在下拉框中重复数据。 这怎么能被阻止。 我希望我的问题很清楚。

你可以看到我在下面的html代码片断中使用胡子。

<div class="cd-filter-block"> <h4>Branches</h4> <div class="cd-filter-content"> <div class="cd-select cd-filters"> <select class="filter" name="selectThis" type="radio" id="branches"> {{#branches}} <option>{{name}}</option> {{/branches}} </select> </div> </div> </div> 

这是Nodejs代码;

 var express = require('express'); var app = express(); var fs = require('fs'); var glob = require('glob'); var mustache = require('Mustache'); var mustacheExpress = require('mustache-express'); // Register '.mustache' extension with The Mustache Express app.engine('mustache', mustacheExpress()); app.set('view engine', 'mustache'); app.set('views', __dirname + '/views'); app.use(express.static('public')); //mustache templates app.get('/', function(req, res){ var view = { 'branches' : listBranches(), 'gdc' : listFiles('../branches/BR/Desktop/other/'), 'san' : listFiles('../branches/BR/other/'), 'gmc' : listFiles('../branches/BR/Mobile/other/'), 'filter' : listFiles1('../branches/BR/Mobile/other/') } res.render('index', view); }); 3 //listBranches var fs = require('fs'); var glob = require('glob'); var path = '../branches/other/' + '*'; var filelist = []; function listBranches() { var files = glob.sync(path).filter(isFolder); for (var i = files.length - 1; i >= 0; i--) { filelist.push({ name: files[i].split('/')[3], }); }; return filelist; } function listFiles(path) { var filelist2 = []; var files = glob.sync(path + '**').filter(isFile); for (var i = files.length -1; i >= 0; i--) { filelist2.push({ "filename" : getFilename(files[i]), "path" : files[i] }); }; return filelist2; } function getFilename(path) { var parts = path.split('/'); return parts[parts.length-1]; } function isFolder(path) { return fs.lstatSync(path).isDirectory(); } function isFile(path) { return fs.lstatSync(path).isFile(); } //filters function listFiles1(path) { var filelist = []; var files = glob .sync(path + '**') .filter(isFile); for (var i = files.length - 1; i >= 0; i--) { filelist.push( {"filename" : createURL('test1','brand','test3','test4',getFilename(files[i])), "path" : files[i] }); console.log(createURL('test1','brand','test3','test4',getFilename(files[i]))); }; return filelist; } function isFile(path) { return fs.lstatSync(path).isFile(); } function getFilename(path) { var parts = path.split('/'); return parts[parts.length-1]; } function splitFile(file,part) { var parts2 = file.split('.'); return parts2[part]; } function createURL(filter1, filter2, filter3, section, file) { var branch = filter1; var brand = filter2; var channel = filter3; return 'http://' + '--' + channel + '.' + brand + '.' + 'local:8085' + '/' + '/' + file } //run app app.listen(3000, function(){ console.log('App running on port 3000!') }); 

每次在你的服务器上调用listBranches() ,你都会向filelist数组中添加更多的项目,所以项目将会积累在该variables中,并且由于listBranches()返回该variables,所以每次调用它时,都会返回一个越来越长的数组。

我不完全清楚你的代码正在做什么,但你至less可以通过改变这个问题来解决这个问题:

 var filelist = []; function listBranches() { var files = glob.sync(path).filter(isFolder); for (var i = files.length - 1; i >= 0; i--) { filelist.push({ name: files[i].split('/')[3], }); }; return filelist; } 

对此:

 function listBranches() { var filelist = []; var files = glob.sync(path).filter(isFolder); for (var i = files.length - 1; i >= 0; i--) { filelist.push({ name: files[i].split('/')[3], }); }; return filelist; } 

请记住,服务器上的模块级别或全局variables会从一个请求持续到下一个请求,并由所有请求共享。 所以,除非这是预期的行为,否则不要使用模块级variables。