2017-08-10 53 views
2

我使用node.js和express.js来构建一个非常简单的应用程序。我想读取一个目录的内容,当我浏览到localhost:3000/names时,应用程序将打印一个内容数组到网页,除了我选择的内容。这里是我的代码:为什么我的Node应用程序在每次刷新后都继续发送数据?

const express = require('express'); 
const fs = require('fs'); 
const app = express(); 
const port = 3000; 

let result = []; 

app.get('/names', (req, res) => { 
    const printNames = (err, file) => { 
    file.forEach(e => { 
     if (e !== 'john') { 
     result.push(e); 
     } 
    }); 
    res.send(result); 
    }; 

    fs.readdir('./home', printNames); 
}); 

app.listen(port,() => { 
    console.log('Listening on port 3000'); 
}); 

该应用程序以我想要的方式工作,但有一个小错误。每次刷新页面时,应用程序都会将相同的数组内容添加到现有数组中。每次刷新后,我的数组都会越来越大。我希望应用程序将数组发送到页面,并在刷新时保持不变。我没有丝毫的想法,为什么我的应用程序是这样做的。有人可以向我解释为什么它的行为是这样的,那么解决这个问题的正确步骤是什么?

+2

结果是一个全局变量,所以它会活到服务器停止。在每一次刷新时,get请求都会触发您的应用程序,因此它会一直添加到结果数组中。 – Malice

回答

5

那是因为你已经声明了在全球范围内result阵列。
您的result阵列每次都会变得越来越大。

只需将声明移动到您的路线,你应该没问题。

这应该很好地工作:

const express = require('express'); 
const fs = require('fs'); 
const app = express(); 
const port = 3000; 

// let result = [];      Remove this line 

app.get('/names', (req, res) => { 
    let result = [];     // And add it here 

    const printNames = (err, file) => { 
    file.forEach(e => { 
     if (e !== 'john') { 
     result.push(e); 
     } 
    }); 
    res.send(result); 
    }; 

    fs.readdir('./home', printNames); 
}); 

app.listen(port,() => { 
    console.log('Listening on port 3000'); 
}); 

了解更多关于作用域在JavaScript这里:
https://www.w3schools.com/js/js_scope.asp

+0

'result'在文件范围内,而不是全局。 'global.result'将在全局范围内。 https://nodejs.org/api/globals.html –

1

每次请求加载页面/名称时,都会重新运行该处理程序中的代码。如果您只想运行一次该脚本,则将其移出处理程序,并仅发送结果。

let result = []; 

const printNames = (err, file) => { 
    file.forEach(e => { 
     if (e !== 'john') { 
     result.push(e); 
     } 
    }); 
}; 

fs.readdir('./home', printNames); 

app.get('/names', (req, res) => { 
    res.send(result) 
}); 
相关问题