如何将承诺的结果 return 作为字符串?

How to return result of a promise as a string?

我正在尝试为 Discord 平台创建一个机器人,它将搜索 SQL 数据库和 return 聊天对象以供人们查看。

SQL 使用 promises,但我一直无法成功地将它 return 将我变成我可以 return 聊天的东西(字符串或数组)。

此代码查询数据库:

function spell(name) {
var spellData = sql.get("SELECT * FROM spells WHERE LOWER(name) = '"+ name.toLowerCase() + "'");
spellData.then( value => {
    console.log(spellData)
    return spellData;
  });

}

table:

CREATE TABLE spells (
    `name` VARCHAR(25),
    `casting_time` VARCHAR(95),
    `components` VARCHAR(215),
    `description` VARCHAR(3307),
    `duration` VARCHAR(52),
    `level` INT,
    `range` VARCHAR(28),
    `school` VARCHAR(13)
  );

我正在使用 node.js、sqlite 和 discord.js。

如果您想 return 将 Promise 对象发送给调用者,只需执行以下操作:

function spell(name) {
    return sql.get("SELECT * FROM spells WHERE LOWER(name) = '" + name.toLowerCase() + "'")
}

然后,在您的客户端中:

spell('some_name').then(function(result) { console.log(result); })

或者,如果您喜欢 awaiting:

let results = await spell('some_name')
console.log(results)

不知道您是否正在使用它,但 "parameterized queries" 将防止 SQL 注入攻击。您选择的 NPM 包应该有一个充分管理的实现。

看来您可能误解了 promise 的工作原理。即使在 promise resolve 之后,它仍然是一个 promise 对象。因此,在您的 then 回调中,当您调用 console.log(spellData) 时,您只是在记录 promise 对象。您想要的数据实际上作为 value 传递到回调中,因此工作代码将是

function spell(name) {
var spellData = sql.get("SELECT * FROM spells WHERE LOWER(name) = '"+ name.toLowerCase() + "'");
return spellData.then( value => {
    console.log(value) //log the returned value
    return value; // returning the value from a then function returns a new promise, so the spell function also returns a promise which you can handle similarly 
  });

}