为什么我的Node应用程序会在每次刷新后继续发送数据?

时间:2017-08-10 17:08:03

标签: node.js express

我使用node.js和express.js来构建一个非常简单的应用程序。我想阅读目录的内容,当我浏览到localhost:3000/names时,应用程序将打印内容的数组到网页,除了我选择不这样做的内容。这是我的代码:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)
});