我想检查第一次是否使用了请求路径。
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(){});
答案 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内存之外。最简单的方法是将其保存到文本文件中。
答案 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中找到与同步相关的有用下一个问题。
描述了共享对象修改的问题。