NodeJs:承诺总是 returns 未定义

NodeJs: Promise always returns undefined

所以我有以下承诺,应该进入我的 sqlite 数据库并告诉我是否有匹配项。即使变量是正确的,它总是 returns 未定义。

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 在一个异步函数中,在我测试之后它确实等待 promise 结束然后继续代码。我不明白为什么它总是未定义。 预先感谢您的帮助。

不要混用 async/awaitPromise 链使用其中之一。

使用 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}

不能同时获取值。

run()用于插入和更新行。

要获得单行,请使用 db.get()

db.get('SELECT * FROM book WHERE id=?', [bookID] , (err,row) => { });

至少如果您使用 npm/sqlite 包。