我可以使用全局变量来同步node express中的请求吗?

时间:2018-01-04 07:14:27

标签: node.js express asynchronous synchronization

我想检查第一次是否使用了请求路径。

nodejs单线程模型确保以下代码按照预期的方式工作吗?是否有任何可能的情况,此代码可以发送" 您是第一个"不止一次 ?

const express = require('express')
const app = express()

let FIRST = true

app.get("/", function(req, res) {   
    res.send("you are "+(FIRST?'':'not')+" the first one")
    FIRST = false       
});

app.listen(8080, function(){});

4 个答案:

答案 0 :(得分:1)

  

是否有任何可能的情况,此代码可以不止一次发送“您是第一个”?

没有。由于请求处理程序中没有异步代码,因此它将同步执行,并且node.js的单线程特性将确保在此请求处理程序使用它时,没有其他任何内容修改FIRST

实际上,编写代码的方式,永远不会显示用户是第一个用户,因为在FIRST中使用它之前,您始终将res.send()设置为false。

答案 1 :(得分:1)

是的,您可以这样做,但您需要在FIRST

之后移动res.send条件
app.get("/", function(req, res) {   
    res.send("you are "+(FIRST?'':'not')+" the first one")
    if (FIRST){
        FIRST = false       
    }
});

不要忘记,如果你的进程退出并再次启动,下一个用户会认为他是第一个。 如果您只想向真正的第一个用户显示此消息,则应使用存储将其保留在RAM内存之外。最简单的方法是将其保存到文本文件中。

Learn more about NodeJS File System Object

答案 2 :(得分:1)

不,它不会像您编码那样有效。由于您在请求处理程序中没有异步代码,因此它将以同步方式执行。

使用您的代码永远不会显示当前用户是第一用户,因为在您的代码中,您在res.send()

之前将FIRST设置为false

只需在res.send()之后移动IF条件,您可以检查以下代码:

const express = require('express')
const app = express()

let FIRST = true

app.get("/", function(req, res) {   
  res.send("you are "+(FIRST?'':'not')+" the first one")
  if (FIRST){
    FIRST = false       
  }
});

app.listen(8080, function(){});

答案 3 :(得分:0)

您可以在Node.js here中找到与同步相关的有用下一个问题。
描述了共享对象修改的问题。