1
尝试执行sql.get()调用时,它在某些地方有效,但在其他地方不起作用,我似乎无法弄清楚有什么不同。
数据库成功打开或者至少我从来没有得到错误,它永远不会关闭。我也在第二个工作示例中使用Discord.js,但不确定这是否相关。
在这个例子中它不起作用。
test.js:sqlite.get()导致TypeError:无法读取属性'get'null
const sql = require("sqlite");
sql.open("./data.sqlite");
exports.getItemID = function(item) {
return new Promise(function (fulfill, reject){
sql.get(`SELECT * FROM items WHERE name="${item}"`).then(row => {
console.log(`do stuff`);
}).catch((e) => {
console.error;
reject(e);
})
});
}
exports.getItemID("Coins").then(itemID => {
console.log(itemID);
}).catch((e) => {
console.log(e);
});
堆栈跟踪:
$ node test.js
TypeError: Cannot read property 'get' of null
at Promise (/Users/julianveerkamp/node_modules/sqlite/main.js:225:18)
at Promise (<anonymous>)
at Database.get (/Users/julianveerkamp/node_modules/sqlite/main.js:224:12)
at /Users/julianveerkamp/workspace/test-bot/test.js:6:13
at Promise (<anonymous>)
at Object.exports.getItemID (/Users/julianveerkamp/workspace/test-bot/test.js:5:12)
at Object.<anonymous> (/Users/julianveerkamp/workspace/test-bot/test.js:15:9)
at Module._compile (module.js:573:30)
at Object.Module._extensions..js (module.js:584:10)
at Module.load (module.js:507:32)
但是,当我调用一个函数与
const sql = require("sqlite");
sql.open("./data.sqlite");
// other stuff
let commandFile = require(`./commands/command.js`);
commandFile.run(client, message, args);
// other stuff
它工作得很好。
command.js:
const sql = require("sqlite");
sql.open("./data.sqlite");
exports.run = (client, message, args) => {
sql.get(`SELECT * FROM scores WHERE userID ="${message.author.id}"`).then(row => {
// Do stuff with row
}).catch(() => {
console.error;
});
}
这不是问题,但仅供参考,代码正在沦为“新Promise反模式”的牺牲品。 'getItemID'没有理由创建一个新的承诺,它已经有一个promise链(来自'get')。 –
运行应用程序时,行中是否存在代码行? stacktrace的'/Users/user/workspace/test-bot/test.js:8:13'这行看起来很可疑! – undefined
啊,谢谢你的提示。我将不得不阅读更多关于“新Promise反模式”和承诺,因为我对node.js和javascript相当陌生。 –