#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"
.
Проблема, с которой я сталкиваюсь, состоит в двух аспектах:
- Запрос GET завершается неудачно каждый раз. В первый раз он возвращает ожидаемые данные, но во второй раз я получаю
Incomplete response received from application
— повторяю. - Я могу получить только сообщение или запрос 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. Да, демо — код был довольно вводящим в заблуждение-вы могли бы подумать, что можете принять это как должное… спасибо за помощь!