首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >角HTTPClient (HTTP)请求永远挂起

角HTTPClient (HTTP)请求永远挂起
EN

Stack Overflow用户
提问于 2019-10-02 12:18:08
回答 1查看 3K关注 0票数 5

我最近开始使用MySQL作为我的项目的数据库(我一直在使用MongoDB )。不过,我在处理HTTP请求时遇到了一些问题。到目前为止,我已经尝试过GET和POST请求,GET永远是挂起的,直到失败和POST没有发送到后端和数据库,同样的。当然,除了查询之外,我并没有改变我在MongoDB数据库中使用的后端配置。

我尝试过调试后端,以检查服务器是否实际运行,并且一切正常。它只是到达指定端点的请求,而这些端点总是挂起。我还尝试记录控制台,如果请求到达某个端点,但不幸的是,没有记录任何内容。

server.js

代码语言:javascript
运行
复制
const app = require("./backend/app");
const debug = require("debug")("node-angular");
const http = require("http");

const normalisePort = setPort => {
  const port = parseInt(setPort, 10);
  if (isNaN(port)) return setPort;
  if (port >= 0) return port;
  return false;
};

const port = normalisePort(process.env.PORT || "8000");
const server = http.createServer(app);

const error = error => {
  if (error.syscall !== "listen") {
    throw error;
  }
  const bind = typeof port === "string" ? "pipe " + port : "port " + port;
  switch (error.code) {
    case "EACCES":
      console.error(bind + " requires elevated privileges");
      process.exit(1);
      break;
    case "EADDRINUSE":
      console.error(bind + " is already in use");
      process.exit(1);
      break;
    default:
      throw error;
  }
};

const listening = () => {
  const address = server.address();
  const bind = typeof port === "string" ? "pipe " + address : "port " + port;
  debug.enabled = true;
  debug("Listening on " + bind);
};

app.set("port", port);
server.on("error", error);
server.on("listening", listening);
server.listen(port, "localhost");

app.js

代码语言:javascript
运行
复制
const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");

const users = require("./routes/users");

const app = express();

app.use(cors);
app.use(bodyParser.json());
app.use(
  bodyParser.urlencoded({
    extended: false
  })
);

app.use((req, res, next) => {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Authorization, Content-Type, Accept"
  );
  res.setHeader(
    "Access-Control-Allow-Methods",
    "GET, POST, PATCH, DELETE, OPTIONS"
  );
  next();
});

app.get("/api/users", users);

module.exports = app;

users.js

代码语言:javascript
运行
复制
const express = require("express");
const router = express.Router();
const db = require("../sql-connection");

router.get("", (req, res, next) => {
  db.query("select * from users;", (error, results, fields) => {
    if (results.length > 0) {
      return res.status(200).send(results);
    } else {
      return res.status(404).send();
    }
  });
});

module.exports = router;

sql-connection.js

代码语言:javascript
运行
复制
const mysql = require("mysql");

const sqlConnection = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "",
  database: "payroll"
});

sqlConnection.connect(error => {
  if (error) throw error;
  console.log("connected to database");
});

module.exports = sqlConnection;

auth.service.ts

代码语言:javascript
运行
复制
export class AuthService {
  private _BASE_URL: string = "http://localhost:8000/api";

  constructor(private http: HttpClient) {}

  public get users(): Observable<any> {
    return this.http.get(this._BASE_URL + "/users");
  }
}

signup.component.ts

代码语言:javascript
运行
复制
export class SignUpComponent {

  constructor(private _authService: AuthService) {}

  public onSignUp(): void {
      this._authService
        .users()
        .subscribe(data => (data ? console.log(data) : console.log("no data")));
  }
}

当订阅用户时,后端的可观察数据应该记录到控制台,否则,控制台上就不会记录“任何数据”。不幸的是,这个请求需要花费很长时间(待定)。但是,如果我不订阅用户,那么在dev tools中的network中没有发送/看到任何请求。

EN

回答 1

Stack Overflow用户

发布于 2020-11-30 08:18:13

我一直在使用MYSQL数据库,我建议您使用mysql2 over mysql

与传统的回调方法相比,mysql2提供了基于承诺的语法。以下是nodejs的Mysql2文档

谈到这个问题,我想可能是因为Nodejs是异步的,而您正在使用同步方法来设置API。另外,当您使用异步编程时,您必须使用try-catch-finally而不是常规的if-else语句来记录错误。

所以您可以使用async (req, res, next)=>{ //your code here },而不仅仅是使用(req, res, next)=>{ //your code here }

此外,还必须在调用sql查询(即:awaitawait db.query )之前对其进行访问。

相反,在mysql2中使用const [data] = await pool.execute(query, [params])更容易。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58201374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档