Node.js:在没有返回记录的 SQL 查询中:TypeError:无法读取未定义的属性
Posted
技术标签:
【中文标题】Node.js:在没有返回记录的 SQL 查询中:TypeError:无法读取未定义的属性【英文标题】:Node.js : On SQL query that returns no record : TypeError: Cannot read property of undefined 【发布时间】:2019-02-05 18:11:39 【问题描述】:更新:开始工作了见底部。
我有这个小脚本将使用 node.js 进行 SQL 查询,使用由用户在不和谐通道 (upperArgs) 中提供的变量。这个想法是它在控制台中打印找到的数据,如果查询为空,则在控制台中打印“无记录”。
如果查询找到记录,效果很好,但如果没有,我仍然会得到
TypeError:无法读取未定义的属性“registered_owner”
我尝试了一系列解决方案,例如将 concat 拆分为两个单独的查询等等,但我似乎无法让这个错误停止抛出。
client.on('message', async message =>
//Then ignores them if they are from another bot.
if (message.author.bot) return;
// Or if they don't have our specified prefix
if (message.content.indexOf(config.prefix) !== 0) return;
// Or if they aren't in our specified channel
if (message.channel.id === (config.channelid))
// Strips prefix, lowercases command, uppercases args to match db value.
const args = message.content.slice(config.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
const upperArgs = args.map(arg => arg.toUpperCase());
var platequery = "SELECT CONCAT(firstname,' ', lastname) AS registered_owner FROM essentialmode.users where identifier = (Select owner FROM essentialmode.owned_vehicles where plate = '" + upperArgs + "')";
if (command === 'check')
var tag = await con.query(platequery, function(err, result)
if (err) throw err
if (tag !== undefined)
var platedata = (result[0].registered_owner);
console.log(platedata);
else console.log("Not found")
);
);
更新:得到它的工作使用 result.length
if (command === 'check')
var tag = await con.query(platequery, function(err, result)
if (err) throw err
if (result.length > 0)
if (result)
console.log("Registerd to " + result[0].registered_owner)
else console.log('Stolen');
);
【问题讨论】:
【参考方案1】:在尝试访问它的属性之前,您应该检查 result 是否有 [0] 元素,然后检查 registered_owner 是否在 result[0] 中。
或者,您可以使用 lodash 之类的方法并执行 _.get(result,'[0].registered_owner',null)
if (typeof tag !== "undefined")
var platedata = result.length > 0
? 'registered_owner' in result[0]
? (result[0].registered_owner)
: null
: null ;
console.log(platedata);
【讨论】:
我一直在尝试检查registered_owner 是否存在,您可以在上面的代码中看到。我不确定如何在调用结果之前检查结果是否有元素。如果查询为空白,问题似乎出现在 var = platedata 阶段。完全不熟悉lodash。那需要另一个图书馆吗?尽量减少这一点。 我得到了它与 result.length 的合作,更新了原始帖子。【参考方案2】:if (command === 'check')
var tag = await con.query(platequery, function(err, result)
if (err) throw err
if (result.length > 0)
if (result)
console.log("Registerd to " + result[0].registered_owner)
else console.log('Stolen');
);
【讨论】:
以上是关于Node.js:在没有返回记录的 SQL 查询中:TypeError:无法读取未定义的属性的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 查询在 phpMyAdmin 中返回的 node-mysql 中缺少结果
MySQL查询丢失导致在phpMyAdmin中返回的node-mysql