无法使用Node.js和简单的数学运算

时间:2018-09-05 13:46:35

标签: node.js

我只需要一种在每次刷新页面时减少用户硬币的方法。这是我的程序:

    var http = require('http');

    var coins = 100;

    var server = http.createServer(function (req, res) {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.write("Hello World");

      coins -= 1;
      res.write('Your coins: ' + coins + '\n');

      res.end();
    })

    server.listen(1338, '127.0.0.1');

    console.log('Server running at http://127.0.0.1:1338/');

这是我每次刷新页面时得到的:

Your coins: 99
Your coins: 97
Your coins: 95
Your coins: 93
Your coins: 91
Your coins: 89
Your coins: 87
...

如您所见,它递减2而不是1。 为什么?

2 个答案:

答案 0 :(得分:6)

让我们从浏览器的角度更深入地研究它。浏览器加载了favicon.ico,它是标签页标题旁边的小图标(通常是24x24)。

该请求由代码处理(答案中正确指出)。

解决方案似乎很简单:1)在禁用预检的情况下使用XHR(用于测试);或忽略OPTIONS动词; 2)忽略/favicon.ico网址。


如果这是由于pre-flight动词OPTIONS引起的,则可以使用显式GET处理程序。

您可以查看Http模块官方文档的this小节。 :)


因此,在深入研究后,OPTIONS 罪魁祸首(对于XHR)。以下内容应该起作用:

var http = require('http');

var coins = 100;

var server = http.createServer();
server.on( 'request', function( req, res ) {

    console.log( req.method );
    var method = req.method;
    if ( method === 'GET' && req.url.indexOf( 'favicon.ico' ) === -1 ) {
        coins -= 1;
    }


    res.writeHead(200, {
        'Content-Type': 'text/plain',
        'Access-Control-Allow-Origin': '*'
    });
    res.write("Hello World");
    res.write('Your coins: ' + coins + '\n');

    res.end();

} );

server.listen(1338, '127.0.0.1');

console.log('Server running at http://127.0.0.1:1338/');

答案 1 :(得分:1)

最后发现了!在浏览器中刷新页面时 发出两个GET请求: 一个用于/favicon.ico,另一个用于/

这两个请求均由该代码处理。为避免这种情况,您可以编写代码来忽略收藏夹请求。

var http = require('http');

var coins = 100;

var server = http.createServer(function (req, res) {
  if (req.url === '/favicon.ico') { // here is the solution
      return res.end();
  }  
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write("Hello World");

  coins -= 1;
  res.write('Your coins: ' + coins + '\n');

  res.end();
})

server.listen(1338, '127.0.0.1');

console.log('Server running at http://127.0.0.1:1338/');