如何将一个 Promise 的结果返回为字符串?

4
我将为Discord平台创建一个机器人,它将搜索SQL数据库并将对象返回到聊天中供人们查看。

SQL使用promises,但我无法成功将其返回的promise转换为可返回给聊天的内容(字符串或数组)。

以下代码查询数据库:

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

}

表格:

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。


首先,使用value.then的参数)而不是Promise本身。 - CertainPerformance
如果你这样做,@CertainPerformance - 那就意味着 - spellData.then( value => { return value; }); - 这是多余的...而且,spell仍然不会返回任何东西。 - Jaromanda X
2个回答

6
如果您想将 Promise 对象返回给调用者,只需执行以下操作:
function spell(name) {
    return sql.get("SELECT * FROM spells WHERE LOWER(name) = '" + name.toLowerCase() + "'")
}

然后,在你的客户端中:
spell('some_name').then(function(result) { console.log(result); })

如果您喜欢使用await

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

不知道您是否正在使用它,但“参数化查询”可以防止SQL注入攻击。您选择的NPM包应该有一个经过充分管理的实现。


请注意,在您调用spell时,您可以在sync函数中使用await,或者使用.then来“访问”所需的值(哎呀,现在您的编辑基本上说明了这一点,所以我感到很愚蠢:p) - Jaromanda X
非常感谢您的帮助! - firewire167

0

看起来你可能误解了 Promise 的工作方式。即使 Promise 已经被解决,它仍然是一个 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 
  });

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接