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

这不是问题,但仅供参考,代码正在沦为“新Promise反模式”的牺牲品。 'getItemID'没有理由创建一个新的承诺,它已经有一个promise链(来自'get')。 –

+1

运行应用程序时,行中是否存在代码行? stacktrace的'/Users/user/workspace/test-bot/test.js:8:13'这行看起来很可疑! – undefined

+0

啊,谢谢你的提示。我将不得不阅读更多关于“新Promise反模式”和承诺,因为我对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函数返回承诺。

相关问题