所以我有以下承諾,應該進入我的 sqlite 資料庫并告訴我是否有匹配項。即使變數是正確的,它總是回傳未定義的。
var checkLoanable = function(bookID){
return new Promise((resolve, reject)=>{
db.run('SELECT * FROM book WHERE id=?',[bookID],(err,row)=>{
if (err) {
console.log("error")
reject();
}
if(row){
if(row.loanable==0){
console.log("not loanable")
reject();
}
console.log("success")
resolve(row);
}else{
console.log("undefined")
reject();
}
console.log("End of promise")
});
})
}
這是函式的呼叫
await checkLoanable(bookID)
.then(()=>{console.log("success")})
.catch(()=>{
res.status(422)
.setHeader('content-type', 'application/json')
.send({ message: "Failed to add loan: book is not loanable!"});
});
console.log("after promise");
await 在 async 函式中,經過測驗,我確實會等待 promise 結束,然后繼續執行代碼。我不明白為什么它總是未定義。預先感謝您的任何幫助。
uj5u.com熱心網友回復:
run()用于插入和更新行。
為了獲得單行使用db.get().
db.get('SELECT * FROM book WHERE id=?', [bookID] , (err,row) => { });
至少如果您使用的是npm/sqlite包。
uj5u.com熱心網友回復:
不要混合async/await和Promise連鎖使用其中之一。
要么用 try...catch 要么Promise..then..catch
try {
const book = await checkLoanable(bookID);
res.json(book);
}catch ({message}) {
res.status(422).send(message);
}
// or
checkLoanable(bookID)
.then((book) => {res.json(book);})
.catch(({message}) => {
res.status(422).json({
message: "Failed to add loan: book is not loanable!"
});
});
例如,如果你使用這樣的東西
const myPromise = () => new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Success!');
}, 1000);
});
(async () => {
const result = await myPromise().then(data => {
console.log({data});
});
console.log({result});
})();
結果將是
{data: 'Success!'}
{result: undefined}
并非兩者都同時獲得值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/439228.html
標籤:javascript 节点.js sqlite 表示
