javascript - Node.js:在没有返回记录的 SQL 查询中:TypeError:无法读取未定义的属性
问题描述
更新:得到它的工作见底部。
我有这个小脚本将使用 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');
});
}
解决方案
您应该在尝试访问其属性之前检查结果是否具有 [0] 元素,然后检查已注册的所有者是否在结果 [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);
}
推荐阅读
- c# - 简单发布并获取 C# WPF
- protocol-buffers - 编码和解码协议缓冲区任何类型的消息
- java - Spring如何处理需要参数的字段上的@Autowired?在这种情况下,JdbcTemplate 与 DataSource
- react-native - Detox - 应用程序卡在 iOS 的启动屏幕中
- django - 如何在 Django/Wagtail 中访问多对多关系的“另一面”?
- node.js - 使用 AXIOS 发送大块 POST 请求时是否可以检测到立即数
- linux - 尝试从 /etc/passwords 中过滤掉用户,然后将它们添加到一些文本中,然后这些文本将转到输出文件
- java - 如何强制我的 JVM 进程始终占用 x GB 内存?
- excel - VBA 使用高级过滤器从一个工作表到另一个工作表中提取唯一值
- c# - 使用 OpenPop.NET 删除时移动到垃圾箱