2017-08-15 3 views
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; 
    }); 
} 
+3

これは問題ではありませんが、FYIだけでは、このコードは「新しい約束による反パターン」に陥っています。 'getItemID'が新しい約束事を作成する理由はありません。それはすでに(get'の)約束を持っています。 –

+1

アプリケーションを実行するときに、コード行に「//行為がある」という行は存在しますか? stacktraceの '/Users/user/workspace/test-bot/test.js:8:13'行は疑わしく見えます! – undefined

+0

ああ、チップのおかげで。私はnode.jsとjavascriptをかなり使い慣れているので、「新しい約束のアンチパターン」と約束を一般的に読む必要があります。 –

答えて

0

これはsqliteのバグかもしれないので、私は先に行って、代わりにsqlite3を使用し、ラップ/)(util.promisifyと機能を自分でpromisified。

const util = require('util'); 
const sqlite3 = require('sqlite3'); 

var db = new sqlite3.Database('./data.sqlite'); 

db.get = util.promisify(db.get); 
db.run = util.promisify(db.run); 

exports.getItemID = function(item) { 
    return new Promise(function (fulfill, reject){ 
     db.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); 
}); 

注:この機能の中の新しいPromiseは必要ありません。 get関数から約束を返すことができます。

関連する問題