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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以使用全局变量来同步node express中的请求吗?相关的知识,希望对你有一定的参考价值。

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

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(){});
答案

有没有这种代码可以不止一次发送“你是第一个”的情况?

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

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

另一答案

是的,你可以做到,但你需要在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

另一答案

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

使用您的代码,它永远不会显示当前用户是第一用户,因为在您的代码中,您在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(){});
另一答案

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

以上是关于我可以使用全局变量来同步node express中的请求吗?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 全局变量

node.js,express - 在循环中以同步方式一个接一个地执行mysql查询

具有弹性 beanstalk 自动缩放的共享 node.js 全局变量

如何定义常量在全局范围内nodejs

如何在 node.js (express) 中全局设置内容类型

Sequelize 无法从 Node/express 应用程序同步到 docker 容器中的 MySQL (ECONNREFUSED)