【问题标题】:Express App GET Routing not working in Production EnvironmentExpress App GET Routing 在生产环境中不起作用
【发布时间】:2019-05-18 19:58:39
【问题描述】:

我在本地主机 (DEV) 和 NameCheap (PROD) 上运行 Node JS 服务器。

两种环境都运行服务器。两者都托管 Web 应用程序。我遇到的问题是尝试在 Javascript 中使用 FETCH API 时。

server.js

var express = require("express");
var path = require("path");
var db = require("./db");
var app = express();
const port = 3000;

app.set("port", process.env.PORT || port);

app.route("/queryDB").get(function(req, res) {
  console.log(req.query.query);

  db.query(req.query.query, function(err, rows, fields) {
    if (err) res.send(err);
    else res.send(rows);
  });
});

app.use(express.static(__dirname, { extensions: ["html"] }));
app.use("/css", express.static(path.join(__dirname + "/css")));
app.use("/js", express.static(path.join(__dirname + "/js")));
app.use("/images", express.static(path.join(__dirname + "/images")));
app.use("/icons", express.static(path.join(__dirname + "/icons")));

app.listen(app.get("port"), "0.0.0.0", () =>
  console.log("Started listening on %s", app.get("port"))
);

使用 fetch 的函数

export async function queryDB(query) {
  const res = await fetch("../queryDB?query=" + query);
  try {
    if (res.ok) {
      return res.json();
    } else {
      // eslint-disable-next-line no-console
      console.log(res);
    }
  } catch (err) {
    // eslint-disable-next-line no-console
    console.log(err);
  }
}

我最初使用app.route 设置它并且只使用app.get。在研究开始使用路线之后。

尝试使用path.join(__dirname + "/queryDB")

提取应该从已设置的 MySql 数据库返回查询结果。目前我正在接收 http://url.com/queryDB?query=SELECT%20Name,%20DATE_FORMAT(Date,%20%22%25W%2C%20%25M%20%25e%2C%20%25Y%22)%20as%20Date,%20Time_Format(Time,%22%25l%3A%25i%20%25p%22)%20as%20Time,%20Description%20FROM%20event%20WHERE%20IsRSVP%20=%201%20ORDER%20BY%20Date,%20Time%20ASC

出现错误Failed to load resource: the server responded with a status of 404 (Not Found)

在我的 DEV 环境中,返回数组中的查询结果。

编辑: 从名称便宜的控制台运行DEBUG=express:* node server 时。我看到路线已创建

  express:router:route new '/queryDB' +1ms
  express:router:layer new '/queryDB' +0ms
  express:router:route get '/queryDB' +0ms

编辑:

更新 Server.JS

var express = require("express");
var path = require("path");
var app = express();
const port = 3000;

app.set("port", process.env.PORT || port);

app.route("http://url.com/query").all(function(req, res) {
  console.log("Query");
  res.send("Query Res");
  return;
});

app.use(express.static(__dirname, { extensions: ["html"] }));
app.use("/css", express.static(path.join(__dirname + "/css")));
app.use("/js", express.static(path.join(__dirname + "/js")));
app.use("/images", express.static(path.join(__dirname + "/images")));
app.use("/icons", express.static(path.join(__dirname + "/icons")));

app.listen(app.get("port"), () =>
  console.log("Started listening ons %s", app.get("port"))
);

更新功能

export async function queryDB(query) {
  const res = await fetch("http://url.com/query");

  try {
    if (res.ok) {
      console.log(res);
      return res;
    } else {
      // eslint-disable-next-line no-console
      console.log(res);
    }
  } catch (err) {
    // eslint-disable-next-line no-console
    console.log(err);
  }
}

【问题讨论】:

  • Namecheap 可能会为您提供端口 80,因此您可能必须更改端口常量变量才能从环境令牌中获取它
  • 请注意,从 URL 运行任意查询是一个非常糟糕的想法。
  • @vortex 我目前正在为端口使用环境变量。名称便宜的端口是 8080
  • @ZackArnett 您是否按照namecheap.com/support/knowledgebase/article.aspx/10047/2182/… 中的说明正确配置了应用程序?
  • @vortex 是的。这就是我遵循的目标。节点服务器正在运行并托管该站点。

标签: javascript node.js express


【解决方案1】:

从 cmets 判断,修复应该是将您在代码中发布的路由从 app.route.get 替换为 app.route.post,如果您使用该路由专门发布或 app.route.all,如果您希望同时发布和获取功能。

【讨论】:

  • Namecheap 控制台输出显示了路由的设置。将其更改为 .all 并不能解决此问题。我的开发环境显示什么时候Get为express:router dispatching GET /db/queryDB +3ms express:router query : /db/queryDB +1ms express:router expressInit : /db/queryDB +0ms 生产环境开始监听端口后没有任何输出
  • 做退货;在您的 console.log 和 db.query 之间,但事先应用正确的更改:router.all 和绝对 URI。那就是停止执行可能有错误的查询,并确保您的生产环境实际侦听 POST http 请求。您无法将开发环境与生产环境进行比较,因为它们的配置不同
  • 我已经更新了 OP。这是你所期待的吗?在 NameCheap 上运行端口 8080
  • 不...您关注的是语义而不是我的答案/cmets 的内容
  • 如果您想成功,请停止操纵建议,整个想法是调试实际失败的部分。为此,您需要包含所有可能性并单独进行测试。将 queryDB 修改为 query 是没有意义的,但是你没有提到它是否有效。 namecheap 控制台现在是否选择您的浏览器请求 /query ?无论哪种方式,Server.js 看起来都是固定的,现在问题是您的客户端以及您如何请求/发布路由。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2019-12-23
相关资源
最近更新 更多