Express Res не работает после подключения к БД - PullRequest
0 голосов
/ 02 июня 2019

Пытаюсь подключить БД с Node.js. Если я запускаю скрипт из консоли, все выглядит нормально. Но при доступе из браузера ответ останавливается при подключении

Из консоли я получаю внутренний конкурс Пример всех слушающих на порту 3000! Подключен Con!

Из браузера я получаю Привет, мир! Внутренний тест

Поскольку сообщение «Listen ...» было перед «Connected» в консольной версии, я подумал, что в версии браузера, возможно, система получила res.end () до того, как подключилась к БД. Таким образом, я переместил res.end () из конца функции app.get в конец функции повторного тестирования, и на всякий случай поместил send () - в исходное место. Но это не было причиной, так как я до сих пор не могу получить "Connected Res!" -message.

var http = require('http');
const express = require('express');
const app = express();
const port = 3000;
var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "login",
  password: "psw",
  database: "db"
});

function restest(req, res) {
    res.write("inside restest");

    con.connect(function(err) {
        if (err) throw err;
        res.write("Connected Res!");
        res.end();
    });
}

function contest() {
    console.log("inside contest");

    con.connect(function(err) {
        if (err) throw err;
        console.log("Connected Con!");
    });
}

contest();

app.get('/nodejs/', function(req, res) { 
    res.write('Hello World!');
    restest(req,res);
    res.send("this should not print out");
});

app.listen(port, () => console.log(`Example app listening on port ${port}!`));

Нет сообщений об ошибках, он просто останавливает ответы после записи "inside restest"

Ответы [ 2 ]

1 голос
/ 02 июня 2019

Итак, вот что происходит: как только вызывается API /nodejs, он напишет текст Hello World!, затем перейдет к функции restest и напишет inside restest, а затем начнет подключатьсяк БД асинхронно, так как DB connect является асинхронной функцией, и она вернется к функции restest и отправит ответ с res.send("this should not print out");.Итак, после этого res больше не доступен внутри функции DB connect.

1 голос
/ 02 июня 2019

Я полагаю, что вы смешиваете некоторые понятия синхронизации / асинхронности.

Попробуйте что-то вроде этого, может быть, это поможет:

function restest(req, res, next) {
    res.write('inside restest');

    con.connect(function(err) {
        if (err) throw err;
        res.write('Connected Res!');
        next();
    });
}

function contest(req, res, next) {
    console.log('inside contest');

    con.connect(function(err) {
        if (err) throw err;
        console.log('Connected Con!');
        next();
    });
}

app.get('/nodejs/', [contest, restest],function(req, res) { 
    res.write('Hello World!');
    restest(req,res);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...