1
sql.get()呼び出しを実行しようとすると、いくつかの場所では動作しますが、他の場所では動作しません。違いは何ですか?
データベースが正常にオープンされているか、少なくともエラーが発生しておらず、決してクローズしません。私はDiscord.jsを2番目の例(実際の例)でも使用していますが、それが適切かどうかはわかりません。
この例では動作しません。
test.js:sqlite.get()の結果がTypeError:nullのプロパティ 'get'を読み取れません
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;
});
}
これは問題ではありませんが、FYIだけでは、このコードは「新しい約束による反パターン」に陥っています。 'getItemID'が新しい約束事を作成する理由はありません。それはすでに(get'の)約束を持っています。 –
アプリケーションを実行するときに、コード行に「//行為がある」という行は存在しますか? stacktraceの '/Users/user/workspace/test-bot/test.js:8:13'行は疑わしく見えます! – undefined
ああ、チップのおかげで。私はnode.jsとjavascriptをかなり使い慣れているので、「新しい約束のアンチパターン」と約束を一般的に読む必要があります。 –