当前位置: 首页 > 知识库问答 >
问题:

使用Express从本地主机获取数据/将数据写入本地主机

黄飞翮
2023-03-14

本质上,它的工作原理是服务器在http://example.com/message上从Twilio接收一个POST请求,该请求包含文本消息的正文。它将它写入~/app/.data/color.tmp的临时文件,客户端通过对http://example.com/color的jQuery.get()调用访问该文件,该调用返回

所以问题来了:我有一个版本的应用程序在Glitch.me上工作,所以我知道这段代码可以工作,但我很难让它在我的域上工作。我安装了应用程序,可以用npm启动它,它成功地向我显示了HTML页面,但Chrome devtools显示脚本在试图访问/color时收到了403。此外,我的站点的新文本不会改变/.data/color.tmp中的颜色值。我想这可能是一个权限问题,但我检查了他们,他们似乎很好。

下面是index.html页面上的服务器文件和脚本

app/server.js

var express = require('express');
var bodyParser = require('body-parser');
var fs = require('fs');
var app = express();
app.use(bodyParser.urlencoded({extended: false})); 
var dataPath = '.data/color.tmp';


// set a new color (saves posted color to disk)
app.post("/message", function (request, response) {
  var dataStr = JSON.stringify(request.body.Body);
  fs.writeFile(dataPath, dataStr);
  response.end();
});

// get the saved color (reading from disk)
app.get("/color", function (request, response) {
  var dataStr = fs.readFileSync(dataPath).toString();
  response.send(JSON.parse(dataStr));
});

app.get("/", function (request, response) {
  response.sendFile(__dirname + '/views/index.html');
});

var listener = app.listen(process.env.PORT, function () {
  console.log('listening on port ' + listener.address().port);
});

app/views/index.html

    <script>
      // checks server for color value and sets background
      function checkForColorChange() {
        $.get('/color', function getColorComplete(data) {
          document.body.style.backgroundColor = data;
            console.log(data);
        })
      }

      // Poll the server at 2000ms interval
      setInterval(checkForColorChange, 2000);

      checkForColorChange();
    </script>

不管怎样,我觉得我一定错过了一些很明显的东西,如果它在Glitch上很容易工作,而不会在我的网站上,但我已经被困了几天,没有取得任何进展!如果有任何帮助,我将不胜感激。如果有什么不清楚的也告诉我。

共有1个答案

阴高寒
2023-03-14

(有关工作示例,请参见下面的更新)

您的代码几乎没有问题:

  1. 您没有检查错误
  2. 您正在使用阻塞函数
  3. 您隐式依赖于文件权限,但没有检查它
  4. 使用字符串连接而不是path.join连接路径
  5. 您经常轮询新数据,而不是等待数据更改
  6. 您没有捕获可能引发异常的函数的异常
  7. 您没有等待异步操作完成,也没有处理错误

您现在遇到的主要问题很可能是文件权限。好消息是,您不需要任何文件访问您正在做的事情,使用文件无论如何都不是最佳的。您只需要将颜色存储在一个变量中,如果您不需要它,它会在服务器重启期间持久存在--即使您需要,我也会使用一个简单的数据库。

例如:

// some initial value:
var color = '#ffffff';

app.post("/message", function (request, response) {
  var color = request.body.Body;
  response.end();
});

// get the saved color (reading from disk)
app.get("/color", function (request, response) {
  response.send(color);
});

app.get("/", function (request, response) {
  response.sendFile(__dirname + '/views/index.html');
});

var listener = app.listen(process.env.PORT, function () {
  console.log('listening on port ' + listener.address().port);
});

这是我将使用的第一个更改--不要依赖于文件系统、权限、竞争条件等。

    null

POSTendpoint略有不同--它使用/colorroute和color=#abcdef而不是/messagebody=...,但是如果需要,您可以很容易地更改它--请参见下面。

服务器代码-Server.js:

// requires removed for brevity

const app = express();
const server = http.Server(app);
const io = socket(server);

let color = '#ffffff';

app.use(bodyParser.urlencoded({ extended: false }));
app.use('/', express.static(path.join(__dirname, 'html')));

io.on('connection', (s) => {
  console.log('Socket.io client connected');
  s.emit('color', color);
});

app.post('/color', (req, res) => {
  color = req.body.color;
  console.log('Changing color to', color);
  io.emit('color', color);
  res.send({ color });
});

server.listen(3338, () => console.log('Listening on 3338'));

HTML页面-索引.HTML:

<!doctype html>
<html lang=en>
<head>
<meta charset=utf-8>
<meta name=viewport content="width=device-width, initial-scale=1">
<title>Node Live Color</title>
<link href="/style.css" rel=stylesheet>
</head>
<body>
<h1>Node Live Color</h1>
<script src="/socket.io/socket.io.js"></script>
<script src="/script.js"></script>
</body>
</html>
body {
  transition: background-color 2s ease;
  background-color: #fff;
}
var s = io();
s.on('color', function (color) {
  document.body.style.backgroundColor = color;
});

特别有趣的是客户端代码有多简单。

对于原始endpoint,在server.js中使用以下内容:

app.post('/message', (req, res) => {
  color = req.body.Body;
  console.log('Changing color to', color);
  io.emit('color', color);
  res.end();
});

GitHub上有完整的示例:

    null
 类似资料:
  • 问题内容: 我一直在尝试使用nativescript创建一个android应用程序。我正在使用fetch模块从服务器获取响应。当我尝试从 **httpbin.org/get 获取响应时,可以。但是当我尝试获取响应时从我的本地服务器上,我收到 网络请求失败。** 错误。 发送到httpbin.org/get- 发送到localhost:8000 / api- 当我尝试通过请求模块在纯node.js中

  • 问题内容: 当我尝试从to进行AJAX调用时,它将引发以下错误。 XMLHttpRequest无法加载 http:// localhost:8000 / project / login / uid = bimt; token = KAMWMS151UWP67Q 。Access- Control-Allow-Origin不允许使用原始http:// localhost。 问题答案: 由于端口不同,因

  • 问题内容: 获取我的本地主机IP地址。但这给了我答案。如果我知道的话。 我需要我的“真实” IP地址(例如192.168.xx)来修改配置文件。我怎么能得到? 问题答案: 我通常使用以下代码: 我不知道它的起源,但是它可以在Linux / Windows上运行。

  • 这可能是愚蠢的,但我使用XAMPP在本地主机上使用MySQL,而且我已经完成了我的应用程序并购买了服务器,所以我如何才能上传我的本地主机数据库到服务器?

  • 使用eventmachine gem,我试图在本地主机上发送和接收数据。以下是我的客户端和服务器文件的代码。 服务器铷 客户铷 我在单独的控制台中执行服务器和客户端文件。以下是客户端的输出 客户端输出 服务器输出 在服务器文件中,我已经打印了收到的数据,但它显示“.................. 谢啦

  • 我和我的合作伙伴正在进行一个项目,在这个项目中,我们必须从Java程序连接到一个