如何使用变量控制Javascript的get请求?

如何使用变量控制Javascript的get请求?,javascript,node.js,express,variables,raspberry-pi,Javascript,Node.js,Express,Variables,Raspberry Pi,我已经用我的Raspberry Pi和Node JS成功地控制了一个中继,代码如下: const express = require("express"); const Gpio = require("onoff").Gpio; const app = express(); const port = 3000; const REL = new Gpio(21, "out"); app.get("/on", (req

我已经用我的Raspberry Pi和Node JS成功地控制了一个中继,代码如下:

const express = require("express");
const Gpio = require("onoff").Gpio;
const app = express();
const port = 3000;
const REL = new Gpio(21, "out");

app.get("/on", (req, res) => {
  REL.writeSync(1);
  res.send("REL is on");
});
app.get("/off", (req, res) => {
  REL.writeSync(0);
  res.send("REL is off");
});
然而,我一直在努力让继电器只有在关闭时才能打开,只有在打开时才能关闭

我尝试了以下代码,但没有成功

const express = require("express");
const Gpio = require("onoff").Gpio;
const app = express();
const port = 3000;
const REL = new Gpio(21, "out");
var x = 0;

if (x === 0) {
  app.get("/on", (req, res) => {
    REL.writeSync(1);
    res.send("Relay is on");
    x = 1;
  });
}

if (x === 1) {
  app.get("/off", (req, res) => {
    REL.writeSync(0);
    res.send("Relay is off");
    x = 0;
  });
}
当我试图通过访问myip:3000/on打开继电器时,它的工作原理与我使用的第一个代码一样,然而,当我试图通过访问myip:3000/off关闭继电器时,我得到了一个错误

不能下车


我不确定这是否与局部作用域不更新全局变量有关。

你所做的很奇怪

const express = require("express");
const Gpio = require("onoff").Gpio;
const app = express();
const port = 3000;
const REL = new Gpio(21, "out");
let status = 0;
app.get("/toggle", (req, res) => {
  if(status){
     REL.writeSync(0);
     res.send("REL is off");
     status = 0;
  }else{
     REL.writeSync(1);
     res.send("REL is on");
     status = 1;
  }
});
当变量发生变化时,尝试公开不同的路由

您不能这样做,相反,您应该公开一个路由,例如file,并在请求的查询参数中传递him on/off(我还认为您应该使用post,而不是get here,并在body中传递它)


如果你需要进一步的解释,写信给我

注册端点和处理传入请求是两个独立的活动

想象一下在应用程序开始侦听请求之前注册端点(通过调用
app.get(path,callback)

接下来,当应用程序运行时,Express尝试将传入的请求与注册的端点处理程序相匹配,以进行进一步处理

如果Express找不到任何匹配的端点,它将返回其默认行为,并显示包含错误信息的页面,例如:
无法获取/退出

在当前代码中,可以有条件地注册端点。启动应用程序时,仅注册上的/端点。若要修复此行为,请将
if
块移动到端点处理程序或更改代码(如建议)。请记住添加
else
块或添加
next()
调用以防止应用程序挂起

const express=require(“express”);
const Gpio=require(“onoff”).Gpio;
常量app=express();
常数端口=3000;
const REL=新的Gpio(21,“输出”);
var x=0;
应用程序获取(“/on)”,(请求、恢复)=>{
如果(x==0){
相对写入同步(1);
res.send(“继电器开启”);
x=1;
}
否则{
res.send(“中继已在运行”);
}
});
应用程序获取(“/off)”,(请求、恢复)=>{
如果(x==1){
相对写同步(0);
res.send(“继电器关闭”);
x=0;
}
否则{
res.send(“继电器已关闭”);
}
});

您的条件位于错误的位置-您仍然希望
/off
端点存在,即使中继最初处于关闭状态。