Обработка запросов на отправку и получение в экспресс

#express

Вопрос:

Первый раз пользуюсь экспрессом здесь.

У меня в app.js файле есть следующее:

 const express = require("express");
const mysql = require("mysql");

const app = express();
const PORT = process.env.PORT || 8000;

const connection = mysql.createConnection({
  host: "localhost",
  user: "admin",
  password: "password",
  database: "mydb",
});

app.use(express.static(__dirname   "/express"));
app.use(express.urlencoded());  // have also tried with "extended: true" and "extended: false"
app.use(express.json());

// GET
app.get("/getAllUserActivity", (req, res) => {
  const order = req.query.order || "id";
  const page = req.query.page || 0;
  const limit = req.query.limit || 100;

  connection.connect((err) => {
    if (err) throw err;
    connection.query(
      "SELECT id, username, counter FROM users ORDER BY ? LIMIT ?,?",
      [order, page, limit],
      (err, results, fields) => {
        if (err) throw err;
        res.send(results);
      }
    );
  });
});

// POST
app.post("/updateUserActivity", (req, res) => {
  const userId = req.body.userId;
  const username = req.body.username;
  const counter = req.body.counter;

  connection.connect((err) => {
    if (err) throw err;
    connection.query(
      "INSERT INTO users (id, username, counter) VALUES (?, ?) ON DUPLICATE KEY UPDATE counter = counter   ?",
      [userId, username, counter],
      (err, results, fields) => {
        if (err) throw err;
        res.send(results);
      }
    );
  });
});
 

Мои запросы на публикацию имеют заголовок "Content-Type": "application/x-www-form-urlencoded" .

Проблема, с которой я сталкиваюсь, состоит в двух аспектах:

  1. Запрос GET завершается неудачно каждый раз. В первый раз он возвращает ожидаемые данные, но во второй раз я получаю Incomplete response received from application — повторяю.
  2. Я могу получить только сообщение или запрос GET для работы — в зависимости от того, как я настроил промежуточное программное обеспечение. Как я могу получить и ОПУБЛИКОВАТЬ здесь и то, и другое?

Старый пользователь php здесь, пытается разобраться в Express. Спасибо!

Комментарии:

1. Пожалуйста, покажите реальный код в обработчиках ваших запросов, чтобы мы могли видеть, что происходит на самом деле.

2. @jfriend00 отлично, — добавил.

3. Замените все if (err) throw err; отправкой клиенту фактического ответа об ошибке. Вы всегда ДОЛЖНЫ отправлять какую-либо форму ответа на каждый входящий запрос.

4. Я не знаю вашей базы данных, но предполагается ли, что вы освободите соединение после того, как закончите?

5. @jfriend00 Действительно, это может быть проблемой для № 1 выше… спасибо. Но как насчет № 2? Вот где я застрял на несколько часов…

Ответ №1:

Замените все if (err) throw err; отправкой клиенту фактического ответа об ошибке. Вы всегда ДОЛЖНЫ отправлять какую-либо форму ответа на каждый входящий запрос. Жаль, что многие фрагменты демонстрационного кода показывают это if (err) throw err; , потому что внутри асинхронного обратного вызова это почти никогда не бывает правильным кодом.

Затем (хотя я не знаю конкретных деталей вашей базы данных) вам нужно будет освободить/закрыть соединения с базой данных после их использования, чтобы они не протекали. Или вы можете использовать объединенный набор подключений, при котором они автоматически возвращаются в пул после выполнения запроса.

Комментарии:

1. Да, демо — код был довольно вводящим в заблуждение-вы могли бы подумать, что можете принять это как должное… спасибо за помощь!