NodeJS中的SQL许诺返回空括号,但是在SQL工作台中执行相同的查询时,它将返回正确的数据

问题描述 投票:0回答:2

我在NodeJS中有一些代码用于React应用。目的很简单。要执行SELECT MySQL查询,并返回正确的数据。但是,我遇到了很多问题。首先,我必须使它成为异步查询。但是,当我在控制台中记录最终答案时,我得到了一个数据对象。

Query {
  domain: null,
  _events:
   { error: [Function],
     packet: [Function],
     timeout: [Function],
     end: [Function] },
  _eventsCount: 4,
  _maxListeners: undefined,
  _callback: undefined,
  _callSite: Error
    at Protocol._enqueue (C:\Users\Anirudh\Desktop\Books Searcher\book-searcher\node_modules\mysql\lib\protocol\Protocol.js:144:48)
    at Connection.query (C:\Users\Anirudh\Desktop\Books Searcher\book-searcher\node_modules\mysql\lib\Connection.js:201:25)
    at Promise (C:\Users\Anirudh\Desktop\Books Searcher\book-searcher\src\api\main.js:25:21)
    at new Promise (<anonymous>)
    at getResult (C:\Users\Anirudh\Desktop\Books Searcher\book-searcher\src\api\main.js:24:21)
    at C:\Users\Anirudh\Desktop\Books Searcher\book-searcher\src\api\main.js:38:16
    at Layer.handle [as handle_request] (C:\Users\Anirudh\Desktop\Books Searcher\book-searcher\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\Anirudh\Desktop\Books Searcher\book-searcher\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\Anirudh\Desktop\Books Searcher\book-searcher\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\Anirudh\Desktop\Books Searcher\book-searcher\node_modules\express\lib\router\layer.js:95:5),
  _ended: false,
  _timeout: undefined,
  _timer: Timer { _object: [Circular], _timeout: null },
  sql: 'SELECT * FROM books_catalouge WHERE Author = "Alex Scarrow"',
  values: undefined,
  typeCast: true,
  nestTables: false,
  _resultSet: null,
  _results: [],
  _fields: [],
  _index: 0,
  _loadError: null,
  _connection:
   Connection {
     domain: null,
     _events: {},
     _eventsCount: 0,
     _maxListeners: undefined,
     config:
      ConnectionConfig {
        host: 'localhost',
        port: '3306',
        localAddress: undefined,
        socketPath: undefined,
        user: 'root',
        password: 'pokemon2345',
        database: 'my_books',
        connectTimeout: 10000,
        insecureAuth: false,
        supportBigNumbers: false,
        bigNumberStrings: false,
        dateStrings: false,
        debug: undefined,
        trace: true,
        stringifyObjects: false,
        timezone: 'local',
        flags: '',
        queryFormat: undefined,
        pool: undefined,
        ssl: false,
        multipleStatements: false,
        typeCast: true,
        maxPacketSize: 0,
        charsetNumber: 33,
        clientFlags: 455631 },
     _socket:
      Socket {
        connecting: true,
        _hadError: false,
        _handle: [Object],
        _parent: null,
        _host: 'localhost',
        _readableState: [Object],
        readable: false,
        domain: null,
        _events: [Object],
        _eventsCount: 7,
        _maxListeners: undefined,
        _writableState: [Object],
        writable: true,
        allowHalfOpen: false,
        _bytesDispatched: 0,
        _sockname: null,
        _pendingData: null,
        _pendingEncoding: '',
        server: null,
        _server: null,
        _idleTimeout: 10000,
        _idleNext: [Object],
        _idlePrev: [Object],
        _idleStart: 16067,
        _destroyed: false,
        [Symbol(asyncId)]: 16,
        [Symbol(bytesRead)]: 0,
        [Symbol(asyncId)]: 20,
        [Symbol(triggerAsyncId)]: 13 },
     _protocol:
      Protocol {
        domain: null,
        _events: [Object],
        _eventsCount: 7,
        _maxListeners: undefined,
        readable: true,
        writable: true,
        _config: [Object],
        _connection: [Circular],
        _callback: null,
        _fatalError: null,
        _quitSequence: null,
        _handshake: true,
        _handshaked: false,
        _ended: false,
        _destroyed: false,
        _queue: [Array],
        _handshakeInitializationPacket: null,
        _parser: [Object] },
     _connectCalled: true,
     state: 'disconnected',
     threadId: null } }

显然存在某种错误,但是当我使用try语句时,它只是跳过了陷阱。摩尔是什么,当我将其发送到React应用本身时,它显示为empty花括号中的string! “ {}”。我完全不知道发生了什么。这是我的NodeJS代码:-

app.get("/retrieve_books", function(req, res) {
  async function getResult(sql) {
    var con = mysql.createConnection({
      host: "localhost",
      port: "3306",
      database: "my_books",
      user: "root",
      password: "pokemon2345"
    });
    con.connect();
    try {
      let promise = new Promise((resolve, reject) => {
        resolve(con.query(sql));
      });
      var answer = await promise;
      console.log("answer");
    } catch (err) {
      console.log(err);
    }
    con.end();
    return answer;
  }

  var sql = JSON.parse(req.query.msg);
  console.log(sql);
  var answer = getResult(sql);
  console.log(answer);
  res.send(JSON.stringify(answer));
});

这是我的React代码:-

import React, { useState } from "react";
import "bootstrap/dist/css/bootstrap.min.css";
import Form from "./searcherFormDumb";
import { toast } from "react-toastify";

function Searcher() {
  const [book, setBook] = useState({
    name: "",
    author: "",
    sno: null,
    series: "",
    type: "",
    genre: "",
    kindleReal: ""
  });
  const defaultState = {
    name: "",
    author: "",
    sno: null,
    series: "",
    type: "",
    genre: "",
    kindleReal: ""
  };

  function handleChange(event) {
    const updatedBook = { ...book, [event.target.name]: event.target.value };
    setBook(updatedBook);
  }

  function handleSubmit(event) {
    event.preventDefault();
    var changed = {};
    function populateChanged(now, old, title, temp) {
      if (now !== old) {
        temp[title] = now;
        return temp;
      } else {
        return temp;
      }
    }
    changed = populateChanged(
      book.name,
      defaultState.name,
      "Book_Name",
      changed
    );
    changed = populateChanged(
      book.author,
      defaultState.author,
      "Author",
      changed
    );
    changed = populateChanged(book.sno, defaultState.sno, "S_no", changed);
    changed = populateChanged(
      book.series,
      defaultState.series,
      "Series_Name",
      changed
    );
    changed = populateChanged(
      book.type,
      defaultState.type,
      "Fiction_Non_fiction_Companion_Prequel",
      changed
    );
    changed = populateChanged(book.genre, defaultState.genre, "Genre", changed);
    changed = populateChanged(
      book.kindleReal,
      defaultState.kindleReal,
      "Kindle_Real",
      changed
    );
    var temp_string = "";
    var key = "";
    var value = "";
    var temp_string_list = [];
    //debugger;
    for (var i = 0; i < Object.keys(changed).length; i++) {
      //debugger;
      key = Object.keys(changed)[i];
      value = changed[key];
      if (i !== Object.keys(changed).length - 1) {
        temp_string = `${key} = "${value}" AND `;
      } else if (i === Object.keys(changed).length - 1) {
        temp_string = `${key} = "${value}"`;
      }
      temp_string_list.push(temp_string);
      //debugger;
      temp_string = "";
      key = "";
      value = "";
    }

    var sql_t = temp_string_list.join("");
    var sql_tt = "SELECT * FROM books_catalouge WHERE ";
    var sql = sql_tt + sql_t;
    toast.success(sql);

    var request = new XMLHttpRequest();
    var jsql = JSON.stringify(sql);
    request.onreadystatechange = function() {
      //debugger;
      if (this.readyState == 4 && this.status == 200) {
        var response = this.responseText;
        console.log(typeof response);
      }
    };
    request.open(
      "GET",
      "http://localhost:3001/retrieve_books" + "?msg=" + jsql,
      true
    );
    request.send(jsql);
    console.log("This is the END");
  }

  return (
    <>
      <Form book={book} onChange={handleChange} onSubmit={handleSubmit} />
    </>
  );
}

export default Searcher;

如果需要更多详细信息,请随时询问。预先感谢!

mysql sql node.js reactjs object
2个回答
2
投票

在代码中使用异步函数时,似乎有几个问题。

  1. 您的get请求的处理程序也应该是async函数,并将await用于异步函数。
  2. getResult内部的承诺应像con.query(sql, resolve)那样解决>
  3. 尝试此变体。

app.get("/retrieve_books", async function(req, res) {
  async function getResult(sql) {
    var con = mysql.createConnection({
      host: "localhost",
      port: "3306",
      database: "my_books",
      user: "root",
      password: "pokemon2345"
    });
    con.connect();
    try {
      let promise = new Promise((resolve, reject) => {
        con.query(sql, (error, results) => resolve(results));
      });
      var answer = await promise;
      console.log("answer");
    } catch (err) {
      console.log(err);
    }
    con.end();
    return answer;
  }

  var sql = JSON.parse(req.query.msg);
  console.log(sql);
  var answer = await getResult(sql);
  console.log(answer);
  res.send(JSON.stringify(answer));
});

2
投票

存在多个问题。我认为它们源于此代码固有的复杂性。

© www.soinside.com 2019 - 2024. All rights reserved.