【问题标题】:Static variable through multiple API calls with Express使用 Express 通过多个 API 调用的静态变量
【发布时间】:2016-04-21 04:19:35
【问题描述】:

我希望有一个变量可以保留上次 API 调用的值。也就是说,每次我调用/api时,它都会将一个变量count加1,当我调用/value时,它会显示count的值。所以如果我调用/api 3 次然后调用/value,它应该打印3。

有可能吗?为了保持变量的值抛出多个 API 调用?我试图避免访问文件和数据库,我确信我可以用这些来做到这一点。

【问题讨论】:

  • 您需要指定您希望此变量是“每个用户”还是“全局”。您是否希望每个单独用户的 /api 调用都使用相同的递增计数?还是每个用户都有自己的单独计数。无论是谁提出的,针对所有请求都会增加的全局计数器要简单得多。

标签: node.js express


【解决方案1】:

如果您在 js 文件的 top-level 中创建变量,它将是该 js 文件的全局变量。此外,如果您的/api/value 路由处理程序位于不同的文件中,您可以创建一个global variable,它将在您的所有其他文件中可见。但是你必须考虑到没有其他变量应该与你的全局变量同名,因为它会被覆盖。 在这里你有一个很好的相关帖子:How to use global variable in node.js?

var count = 0;

app.get('/api', function(req, res) {
  count += 1;
  res.send();
}

app.get('/value', function(req, res) {
  res.send(count);
}

【讨论】:

  • 简单的解决方案,不知道为什么我之前没有看到它。谢谢。
【解决方案2】:

您可以创建一个您可以在应用程序的任何部分需要的模块。

例如,您在counter.js 中有一个模块定义为

var counter = function() {
    var count = 0;

    this.addCount = function() {
        count++
    }

    this.getCount = function() {
        return count;
    }
}

counter.instance = null;

counter.getInstance = function() {
    if (this.instance === null) {
        this.instance = new counter();
    }

    return this.instance;
}

module.exports = counter.getInstance();

现在,您可以像这样在server.js 中使用它

var express = require('express');
var app = express();

var bodyParser = require('body-parser');
var morgan = require('morgan');

app.use(morgan('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

var counter = require('./counter.js');
app.get('/value', function(req, res, next) {
    res.send('Count = ' + counter.getCount());
});

app.use('/api', require('./api.js'));

var server = app.listen(3000, function () {
    var host = server.address().address;
    var port = server.address().port;
    console.log("Server listening at http://%s:%s", host, port);
});

在你的api.js 中像这样

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

var counter = require('./counter.js');

router.get('/', function(req, res, next) {
    counter.addCount();
    res.send('API Called');
});

module.exports = router;

【讨论】:

  • 我猜这是最好的方法
【解决方案3】:

你可以在你的 api 之外设置一个像这样的全局变量...

var count = 0;

那就做一个这样的api吧……

app.get('/value', function(req, res) {
  res.send(count);
})
app.get('/api', function(req, res) {
  count = count + 1;
  res.send();
})

上面的例子是使用 express 框架。如果你不使用它,你应该习惯它。这是一个很棒的框架!

【讨论】:

    【解决方案4】:

    是的,Use 可以使用 express session 或任何其他 session 用于相同或全局变量

    【讨论】:

    • 你为什么认为在会话中存储该变量?
    • 在会话中存储很容易,并且可以很好地跟踪数据,也有助于避免将值保存在全局变量中。
    • 但是我们不知道这个变量的真正作用。他似乎希望成为全球性的东西。不是单个客户端变量。
    猜你喜欢
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多