javascript - 为什么我的节点数据库查询不起作用
问题描述
在 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 的错误。
解决方案
你的代码各种乱七八糟。你有一些不合适的地方。这是一个更好但不完美的版本:
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。
推荐阅读
- python - 在函数中打开/关闭 print() 的智能方法
- c# - 如何使用应该存在的 2 个字段编写嵌套查询
- php - 如何在 PHP 7.1 中使用 preg_match 查找名称中有点的文件
- python - Keras:替换模型的输入层不会更新 model.summary 中其他层的输出形状等
- javascript - 当文本框不为空/某些值被传递到文本框时,如何从文本框中调用 javascript 函数
- php - 使用 php curl 播放 .m3u8 视频
- css - webpack没有加载@font-face
- ajax - 在 Typo3 中使用 ajax 加载时,Paginate Widget 会破坏布局
- linux - 如何将 msgmax 从 8192 字节(/proc/sys/kernel/msgmax)增加到 16000
- android - Android 中基于 BLE 的 IPV6 支持