首页 > 解决方案 > 为什么我的节点数据库查询不起作用

问题描述

在 ndoe 和 mysql 交互中是新的,我试图在我的查询中获取一个 collunm 的数据,到目前为止我所做的:groupmemberlist 是一个数组数组,我正在循环获取每个值。

%%编辑%%

我已经添加了这些更改,但仍然只在我的变量上未定义:

    for (var m = 0; m < groupmemberlist.length; m++) {
                var imgreturned = findpicture(groupmemberlist[m], returnimage);
                console.log(imgtag);
            }

这个循环可以函数 findpicture 是:

   function returnimage(imgid) {
                imgtag = '<img href="/uploads/' + imgid[0].User_Profile_Photo + ">";

            }

            function findpicture(id, callback) {
                return new Promise(function (resolve, reject) {
                    db.query('SELECT User_Profile_Photo FROM users WHERE id = ?', [id], function (error, results, fields) {
                        if (error) {
                            throw error;
                        } else {
                            imgFromId = results;
                        }
                        callback(imgFromId);
                    });
                })
            }

我得到的错误是(重复 4 次):

Query {
  domain: null,
  _events:
   { error: [Function],
     packet: [Function],
     end: [Function],
     timeout: [Function],
     'start-tls': [Function] },
  _eventsCount: 5,
  _maxListeners: undefined,
  _callback: [Function],
  _callSite: Error
    at Protocol._enqueue (C:\Users\yvyma.DESKTOP-74AK6UQ\Desktop\Nodeapp\express-cc\node_modules\mysql\lib\protocol\Protocol.js:144:48)
    at Connection.query (C:\Users\yvyma.DESKTOP-74AK6UQ\Desktop\Nodeapp\express-cc\node_modules\mysql\lib\Connection.js:200:25)
    at findpicture (C:\Users\yvyma.DESKTOP-74AK6UQ\Desktop\Nodeapp\express-cc\routes\index.js:210:31)
    at Query.<anonymous> (C:\Users\yvyma.DESKTOP-74AK6UQ\Desktop\Nodeapp\express-cc\routes\index.js:232:35)
    at Query.<anonymous> (C:\Users\yvyma.DESKTOP-74AK6UQ\Desktop\Nodeapp\express-cc\node_modules\mysql\lib\Connection.js:502:10)
    at Query._callback (C:\Users\yvyma.DESKTOP-74AK6UQ\Desktop\Nodeapp\express-cc\node_modules\mysql\lib\Connection.js:468:16)
    at Query.Sequence.end (C:\Users\yvyma.DESKTOP-74AK6UQ\Desktop\Nodeapp\express-cc\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:24)
    at Query._handleFinalResultPacket (C:\Users\yvyma.DESKTOP-74AK6UQ\Desktop\Nodeapp\express-cc\node_modules\mysql\lib\protocol\sequences\Query.js:139:8)
    at Query.EofPacket (C:\Users\yvyma.DESKTOP-74AK6UQ\Desktop\Nodeapp\express-cc\node_modules\mysql\lib\protocol\sequences\Query.js:123:8)
    at Protocol._parsePacket (C:\Users\yvyma.DESKTOP-74AK6UQ\Desktop\Nodeapp\express-cc\node_modules\mysql\lib\protocol\Protocol.js:278:23),
  _ended: false,
  _timeout: undefined,
  _timer: Timer { _object: [Circular], _timeout: null },
  sql: 'SELECT User_Profile_Photo FROM users WHERE id = 6 ',
  values: [ 6 ],
  typeCast: true,
  nestTables: false,
  _resultSet: null,
  _results: [],
  _fields: [],
  _index: 0,
  _loadError: null,
  _connection:
   Connection {
     domain: null,
     _events: {},
     _eventsCount: 0,
     _maxListeners: undefined,
     config:
      ConnectionConfig {
        host: '127.0.0.1',
        port: 3306,
        localAddress: undefined,
        socketPath: undefined,
        user: 'root',
        password: undefined,
        database: 'express-cc',
        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,
        protocol41: true },
     _socket:
      Socket {
        connecting: false,
        _hadError: false,
        _handle: [Object],
        _parent: null,
        _host: null,
        _readableState: [Object],
        readable: true,
        domain: null,
        _events: [Object],
        _eventsCount: 5,
        _maxListeners: undefined,
        _writableState: [Object],
        writable: true,
        allowHalfOpen: false,
        _bytesDispatched: 151,
        _sockname: null,
        _pendingData: null,
        _pendingEncoding: '',
        server: null,
        _server: null,
        _idleTimeout: -1,
        _idleNext: null,
        _idlePrev: null,
        _idleStart: 9257,
        _destroyed: false,
        [Symbol(asyncId)]: 44,
        [Symbol(bytesRead)]: 0,
        [Symbol(asyncId)]: 47,
        [Symbol(triggerAsyncId)]: 10 },
     _protocol:
      Protocol {
        domain: null,
        _events: [Object],
        _eventsCount: 6,
        _maxListeners: undefined,
        readable: true,
        writable: true,
        _config: [Object],
        _connection: [Circular],
        _callback: null,
        _fatalError: null,
        _quitSequence: null,
        _handshake: true,
        _handshaked: true,
        _ended: false,
        _destroyed: false,
        _queue: [Array],
        _handshakeInitializationPacket: [Object],
        _parser: [Object] },
     _connectCalled: true,
     state: 'authenticated',
     threadId: 767 } }

我还尝试在查询函数中说 var imgname = (results[0].User_Profile_Photo) 并尝试 console.log var imgname 但它返回 var undefined 的错误。

标签: javascriptmysqlnode.js

解决方案


你的代码各种乱七八糟。你有一些不合适的地方。这是一个更好但不完美的版本:

function findpicture(id) {
  let imgFromId;

  db.query('SELECT User_Profile_Photo FROM users WHERE id = ?', [id], function (error, results, fields) {
    if (error) {
      throw error;
    }

    imgFromId = results;
    console.log(imgfromid);
  });
}

现在,让我们解释一下您的代码有什么问题。它将为您提供一些很好的概念来理解。

db.query正在使用回调函数。这意味着它是一个asyncronous请求。这意味着结果需要一些时间才能回来。您现在通过分配db.query来尝试做imgFromId的不是获取查询结果,而只是分配对来自db.query.

在我分享的更正版本中,您需要imgFromId在回调函数之外定义。当结果返回时,您将结果分配给回调函数内部的结果。

但是,这仍然无法解决您的问题。由于您正在处理异步代码,因此您需要查看 Promises 和 async/await。


推荐阅读